Scala próbuje unikać wartości undefined/null. Można jednak rozwiązać ten problem, dając wartości zwracanych do przypadków, gdy try
zawodzi i inicjowanie a
z całego try
wyrażenia:
private val a: SomeClass =
try {
someThing // this statement may throw an exception
} catch {
case ex: Exception => {
ex.printStackTrace()
someDefault
}
}
Aktualizacja: W Scala byłoby prawdopodobnie bardziej idiomatyczne użycie Try
od scala.util
:
val x : Int =
Try({
someThing
}).recoverWith({
// Just log the exception and keep it as a failure.
case (ex: Throwable) => ex.printStackTrace; Failure(ex);
}).getOrElse(1);
Try
pozwala komponować obliczeń, które mogą zakończyć się niepowodzeniem wyjątek na różne sposoby. Na przykład, jeśli masz dwie obliczeń typu Try
można nazwać
thing1.orElse(thing2).getOrElse(someDefault)
ten biegnie thing1
i zwraca jego wynik, jeśli jest to sukces. Jeśli się nie powiedzie, będzie kontynuował z thing2
. Jeśli też się nie powiedzie, zwraca someDefault
. Można również użyć recover
lub recoverWith
odzyskać z pewnymi wyjątkami wykorzystaniem funkcji cząstkowych (i potencjalnie ponowne częściowe te funkcje).
Jaka powinna być wartość 'a', jeśli' try' nie działa? –
@TheTerribleSwiftTomato Będę nieważny lub coś nieokreślonego. Chcę tylko, aby zainicjować je w try catch, gdyż przypisanie może rzucić wyjątek – Pooya
@TheTerribleSwiftTomato jak otwarcie pliku Stream – Pooya