«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