2013-07-07 22 views
5

Mam ten kod w Scala, a obiekt powinien być wartością nie zmienną, Jak zainicjować obiekt a w bloku try?Jak mogę zainicjować obiekt val w bloku catch catch?

object SomeObject { 
    private val a : SomeClass 

    try { 
    a=someThing // this statement may throw an exception 
    } 
    catch { 
    case ex: Exception=> { 
     ex.printStackTrace() 
    } 
    } 
} 
+2

Jaka powinna być wartość 'a', jeśli' try' nie działa? –

+0

@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

+0

@TheTerribleSwiftTomato jak otwarcie pliku Stream – Pooya

Odpowiedz

16

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).

+0

Nie mogę znaleźć Spróbuj w pakiecie scala.util. Jaka jest twoja wersja scala? – Pooya

+1

'Try' jest dostępna od 2.10: http://www.scala-lang.org/api/current/index.html#scala.util.Try –

+0

+1 Ładny kawałek informacji w aktualizacji. –

3

Ponieważ w blokach Scala mieć wartości zwracanych i ostatnie wyrażenie jest zwracana wartość domyślnie, można to zrobić:

object SomeObject { 
    private val a : SomeClass = { //this additional block not necessary, but added for clarity 
     try { 
     someThing // this statement may throw an exception 
     } 
     catch { 
     case ex: Exception=> { 
      ex.printStackTrace() 
      null 
     } 
     } 
    } 
} 

. Muszę jednak dodać, że to wygląda jak starasz się coś osiągnąć potencjalnie wysadzenie w twarz później - trzeba będzie null kontrole w każdym kodzie, który wykorzystuje tę wartość.

+1

Scala jest wielkim język – Pooya

Powiązane problemy