2016-06-27 11 views
4

Ich habe eine Funktion, die (möglicherweise) StackOverflowError erzeugen kann. Natürlich ist dies ein Zeichen für ein schlechtes Design, aber im Moment habe ich beschlossen, es in den Try einzupacken.Warum versucht Scala java.lang.StackOverflowError nicht abzufangen?

Try{ 
    Calculator.eval(..) 
} 

Das Ergebnis erwarte ich ist Failure (java.lang.StackOverflowError). Das Ergebnis, das ich bekomme, ist nur java.lang.StackOverflowError. Ich nehme an, das Problem ist, dass StackOverflowError keine Ausnahme ist, sondern ein Fehler. Wenn ja, gibt es irgendwelche Möglichkeiten, diese Art von Fehlern zu "fangen", indem Sie Try oder eine andere Monade benutzen?

Antwort

8

Laut Scala-Dokumentation.

Hinweis: nur nicht-tödliche Ausnahmen von den Kombinatoren gefangen werden auf Versuche (siehe scala.util.control.NonFatal). Schwere Systemfehler, auf der anderen Seite Hand, werden geworfen.

Nein Throwable -> Errors werden von Try abgefangen.

Ich würde einige Wrapper implementieren, die zu handhaben Errors für Ihren Fall erlauben:

object TryAll { 
    def apply[K](f: => K): Try[K] = 
    try { 
     Success(f) 
    } catch { 
     case e: Throwable => Failure(e) 
    } 
} 


TryAll { 
    Calculator.eval(..) 
} 
+0

Dank! Das funktioniert wirklich. –

Verwandte Themen