¿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
¿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
scala.util.control.Exception.ignoring(classOf[ExceptionType]) {
... // Some throwing code
}
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 =>
}
@ 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.
Hows sobre:
Try {
// some throwing code
}
Esto ignorar todas las excepciones no fatales, que es lo que quiere hacer la mayor parte del tiempo.
¿Qué quiere decir con excepciones no fatales? – Basilevs
Eche un vistazo a la fuente de Try, llama a Non Fatal, que considera que VirtualMachineError, ThreadDeath, InterruptedException, LinkageError y ControlThrowable son fatales – jonathanChap
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
Supongo que DefaultTo debería reemplazarse con DefaultOn en el primer bloque de código. – Qrilka
@Qrilka - ¡Sí, gracias! Arreglado. –
Por cierto podría escribirse un poco más corto con 'handling (classOf [NumberFormatException]). By (_ => 0) {" Hi ".toInt}' – Qrilka