是否有更优雅的方式来撰写以下内容?
try {
... // Some throwing code
return first
}
catch {
case e:ExceptionType => {} // No code to execute. Ignore error.
}
return second
答案 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
}
这将忽略所有非致命异常,这是您大多数时间想要做的事情。