Javas try-catch-finally
fängt keinen schwerwiegenden Fehler ab.
Scalas "try-catch-finally" fängt auch schwerwiegende Fehler ab.
Bekannte schwerwiegende Ausnahmen sind "OutOfMemoryError", und solche schwerwiegenden Ausnahmen sollten nicht im Programm abgefangen werden.
scala> try {
| throw new StackOverflowError
| } catch {
| case e: Throwable => println("error")
| }
error
Daher ist es in Scala üblich (?), Ausnahmen mit "scala.util.Try" anstelle von "try-catch-finally" abzufangen.
scala.util.Try
fängt wie Javas try-catch-finally
nur nicht schwerwiegende Fehler ab (NonFatalError).
scala> Try(throw new StackOverflowError) recover {
| case e: Throwable => println("error")
| }
java.lang.StackOverflowError
at .$anonfun$res13$1(<console>:13)
at scala.util.Try$.apply(Try.scala:209)
... 38 elided
Aber "scala.util.Try" wird zu "Failure", wenn eine Ausnahme ausgelöst wird, und es gibt keinen Mechanismus wie "finally", um am Ende etwas zu tun. Ich möchte "endlich" sogar in Scala. Ich denke, es gibt so eine Zeit.
In einem solchen Fall gibt es eine Möglichkeit, "scala.util.control.Exception.ultimate" zu verwenden. "Schließlich" kann erreicht werden, indem die letzte auszuführende Aktion übergeben wird, unabhängig davon, ob eine Ausnahme auftritt.
scala> Try {
| ultimately {
| println("finally !")
| } {
| println("do something")
| throw new Exception
| println("no execute")
| }
| }
do something
finally !
res: scala.util.Try[Unit] = Failure(java.lang.Exception)
Auf diese Weise können Sie schwerwiegende Fehler ignorieren und nur nicht schwerwiegende Fehler abfangen. Wenn Sie nicht "endlich" verwenden müssen, brauchen Sie natürlich auch nicht "letztendlich".
Es gibt nur zwei japanische Artikel über scala.util.control.Exception.
Wie Sie kommentiert haben, auch Scalas "try-catch-finally" Der Mustervergleich mit "Catch" mit "NonFatal" kann nur nicht tödliche erfassen.
Nicht tödliche Ausnahme --scala_text
Recommended Posts