«Try-catch-finally» de Java ne détecte pas les erreurs fatales, «Try-catch-finally» de Scala détecte également des erreurs fatales. Les exceptions fatales bien connues incluent ʻOutOfMemoryError`, et de telles exceptions fatales ne doivent pas être interceptées dans le programme.
scala> try {
| throw new StackOverflowError
| } catch {
| case e: Throwable => println("error")
| }
error
Par conséquent, dans Scala, il est courant (?) D'intercepter les exceptions en utilisant scala.util.Try
au lieu de try-catch-finally
.
scala.util.Try
, comme try-catch-finally
de Java, ne détecte que les erreurs non fatales (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
Mais scala.util.Try
devient Failure
lorsqu'une exception est levée, et il n'y a pas de mécanisme comme finally
pour faire quelque chose à la fin. Je veux "enfin" même dans Scala. Je pense qu'il y a un tel moment.
Dans un tel cas, il existe un moyen d'utiliser scala.util.control.Exception.ultually
. Vous pouvez atteindre `` enfin '' en passant la dernière action à entreprendre, qu'une exception se produise ou non.
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)
De cette manière, vous pouvez ignorer les erreurs fatales et ne détecter que les erreurs non fatales.
Bien sûr, si vous n'avez pas besoin d'utiliser finally
, vous n'avez pas besoin non plus de ʻultimement`.
Il n'existe que deux articles japonais sur scala.util.control.Exception.
Comme vous l'avez commenté, le try-catch-finally
de Scala aussi
La correspondance de motifs avec Catch
en utilisant NonFatal
ne peut capturer que les non fatales.
NonFatal Exception --scala_text
Recommended Posts