如何忽略异常?

时间:2010-10-18 14:48:35

标签: scala

是否有更优雅的方式来撰写以下内容?

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

4 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:16)

@Daniel已经提供了用于执行此操作的规范方法。查看scala.util.control.Exception中的其他方法 - 它们非常有用且通用!

如果您需要从try块中获取返回值,请使用failing而不是ignoring(但要注意结果是Any,即不是类型安全的)。

您也可以编写自己的异常捕获器,这对于重型工作来说有点慢,但是否则很好用:

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

或者如果您喜欢选项:

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

或者你可以从这个以及库例程中获得灵感,并创建自己的方法来忽略多个不同的异常并保留返回值的类型。

答案 2 :(得分:4)

在Scala中,不检查所有异常,因此如果您不想要,则可以跳过处理它们(因此异常将升级到更高级别)。以你想要的方式默默地忽略异常通常是一种不好的做法。但是,您的代码可以缩短为:

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

答案 3 :(得分:1)

如何:

Try { 
     // some throwing code 
}

这将忽略所有非致命异常,这是您大多数时间想要做的事情。