2010-10-18 11 views
26

¿Hay alguna forma más elegante de escribir lo siguiente?¿Cómo ignoro una excepción?

try { 
    ... // Some throwing code 
    return first 
} 
catch { 
    case e:ExceptionType => {} // No code to execute. Ignore error. 
} 
return second 

Respuesta

30
scala.util.control.Exception.ignoring(classOf[ExceptionType]) { 
    ... // Some throwing code 
} 
4

En Scala todas las excepciones no son controlados, por lo que si usted no quiere, es posible que omita el manejo de ellos (y por tanto excepción será escalado a un nivel más alto). Ignorar silenciosamente una excepción de la forma en que desea hacerlo generalmente es una mala práctica. Sin embargo, su código puede ser acortado a:

try { 
    ... // Some throwing code 
} catch { 
    case e:ExceptionType => 
} 
15

@ Daniel ya ha proporcionado el método canónica a utilizar para hacer esto. Consulte los otros métodos en scala.util.control.Exception - ¡son bastante útiles y genéricos!

Si usted necesita para obtener un valor de retorno del bloque try, utilice failing en lugar de ignoring (pero tenga en cuenta que el resultado es un Any, es decir, no Typesafe).

También puede escribir su propia excepción-receptor, que será un poco lento para trabajos pesados, pero de otra manera agradable de usar:

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 

O si te gusta opciones:

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 

O puede inspirarse en esto más las rutinas de la biblioteca y crear sus propios métodos para ignorar múltiples excepciones diferentes y conservar los tipos en el valor de retorno.

+0

Supongo que DefaultTo debería reemplazarse con DefaultOn en el primer bloque de código. – Qrilka

+0

@Qrilka - ¡Sí, gracias! Arreglado. –

+0

Por cierto podría escribirse un poco más corto con 'handling (classOf [NumberFormatException]). By (_ => 0) {" Hi ".toInt}' – Qrilka

0

Hows sobre: ​​

Try { 
    // some throwing code 
} 

Esto ignorar todas las excepciones no fatales, que es lo que quiere hacer la mayor parte del tiempo.

+0

¿Qué quiere decir con excepciones no fatales? – Basilevs

+0

Eche un vistazo a la fuente de Try, llama a Non Fatal, que considera que VirtualMachineError, ThreadDeath, InterruptedException, LinkageError y ControlThrowable son fatales – jonathanChap

+0

Esto no es exacto. A partir de Scala 2.11, esto daría una advertencia en tiempo de compilación: "Un intento sin captura o finalmente es equivalente a poner su cuerpo en un bloque, no se manejan excepciones". De hecho, es idéntico a no usar el Try en absoluto. Tienes que agregar un catch para atrapar excepciones NonFatal, es decir catch {case NonFatal (e) =>} – TaylerJones

Cuestiones relacionadas