Comment ignorer une exception?

Y a-t-il une façon plus élégante d'écrire ce qui suit?

try {
    ... // Some throwing code
    return first
} 
catch {
    case e:ExceptionType => {} // No code to execute. Ignore error.
}
return second
29
demandé sur Peter Mortensen 2010-10-18 18:48:34

4 réponses

scala.util.control.Exception.ignoring(classOf[ExceptionType]) {
  ... // Some throwing code
}
34
répondu Daniel C. Sobral 2010-10-18 15:48:15

@Daniel a déjà fourni la méthode canonique à utiliser pour ce faire. Regardez à travers les autres méthodes dans scala.util.control.Exception-ils sont très utiles et génériques!

Si vous avez besoin pour obtenir une valeur de retour du bloc try, utiliser failing au lieu de ignoring (mais sachez que le résultat est un Any, c'est à dire pas typesafe).

Vous pouvez également écrire votre propre exception-catcher, qui sera un peu lent pour les travaux lourds mais autrement agréable à utiliser:

class DefaultOn[E <: Exception] {
  def apply[A](default: => A)(f: => A)(implicit m: Manifest[E]) = {
    try { f } catch { case x if (m.erasure.isInstance(x)) => default }
  }
}
object DefaultOn { def apply[E <: Exception] = new DefaultOn[E] }

scala> DefaultOn[NumberFormatException](0) { "Hi".toInt }
res0: Int = 0

Ou si vous le souhaitez options:

class TryOption[E <: Exception] {
  def apply[A](f: => A)(implicit m: Manifest[E]) = {
    try { Some(f) } catch { case x if (m.erasure.isInstance(x)) => None }
  }
}
object TryOption { def apply[E <: Exception] = new TryOption[E] }

scala> TryOption[NumberFormatException] { "Hi".toInt }
res1: Option[Int] = None

Ou vous pouvez être inspiré par ceci plus les routines de bibliothèque et créer vos propres méthodes pour ignorer plusieurs exceptions différentes et préserver les types sur la valeur de retour.

16
répondu Rex Kerr 2011-02-20 21:06:58

Dans Scala, toutes les exceptions ne sont pas vérifiées, donc si vous ne le souhaitez pas, vous pouvez simplement les ignorer (et donc l'exception sera escaladée à un niveau supérieur). Ignorer silencieusement une exception comme vous le souhaitez est généralement une mauvaise pratique. Cependant, votre code peut être raccourci en:

try {
  ... // Some throwing code
} catch {
  case e:ExceptionType => 
}
4
répondu Vasil Remeniuk 2010-10-18 15:32:28

Hows sur:

Try { 
     // some throwing code 
}

Cela ignorera toutes les exceptions non fatales, ce que vous voulez faire la plupart du temps.

0
répondu jonathanChap 2017-04-06 08:31:59