Comment attraper plusieurs exceptions à la fois à la Scala? Est-il une meilleure façon qu'en C#: Attraper plusieurs Exceptions à la fois?
Réponses
Trop de publicités?Comme vous l'avez accès à l'intégralité de la correspondance de motif capacités de la scala dans la clause catch, vous pouvez faire beaucoup de choses :
try {
throw new IOException("no such file")
} catch {
case _ : SQLException | _ : IOException => println("Resource failure")
case e => println("Other failure");
}
Notez que si vous avez besoin d'écrire les mêmes gestionnaires, encore et encore, vous pouvez créer votre propre structure de contrôle pour que :
def onFilesAndDb(code: => Unit) {
try {
code
} catch {
your handling code
}
}
Certaines de ces méthodes sont disponibles dans l'objet de la scala.util.de contrôle.Des Exceptions. à défaut, failAsValue, la manipulation peut être juste ce dont vous avez besoin
Edit : Contrairement à ce qui est dit ci-dessous, d'autres modèles peuvent être liés, de sorte que la solution proposée est inutilement complexe. Voir @agilesteel solution
Malheureusement, avec cette solution, vous n'avez pas d'accès à l'exception des cas où vous utilisez des modèles alternatifs. À ma connaissance, vous ne pouvez pas lier sur un autre modèle de cas e @ (_ : SqlException | _ : IOException)
. Donc, si vous avez besoin d'accéder à l'exception, vous devez nid de rapprochement :
try {
throw new RuntimeException("be careful")
} catch {
case e : RuntimeException => e match {
case _ : NullPointerException | _ : IllegalArgumentException =>
println("Basic exception " + e)
case a: IndexOutOfBoundsException =>
println("Arrray access " + a)
case _ => println("Less common exception " + e)
}
case _ => println("Not a runtime exception")
}
Vous pouvez également utiliser scala.util.control.Exception
:
import scala.util.control.Exception._
import java.io.IOException
handling(classOf[RuntimeException], classOf[IOException]) by println apply {
throw new IOException("foo")
}
Cet exemple peut-être pas le meilleur exemple pour illustrer comment vous pouvez l'utiliser, mais je le trouve assez utile dans de nombreuses occasions.