78 votes

La capture de plusieurs exceptions à la fois à la Scala

Comment attraper plusieurs exceptions à la fois à la Scala? Est-il une meilleure façon qu'en C#: Attraper plusieurs Exceptions à la fois?

174voto

agilesteel Points 8330

@didierd Vous pouvez lier l'ensemble du modèle à une variable comme ceci:

try {
   throw new java.io.IOException("no such file")
} catch {
   // prints out "java.io.IOException: no such file"
   case e @ (_ : RuntimeException | _ : java.io.IOException) => println(e)
}

33voto

Didier Dupont Points 18256

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")
}

16voto

Wilfred Springer Points 5430

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X