捕获Scala 2.8 RC1中的所有异常

Mic*_*mer 9 warnings scala exception try-catch catch-all

我在文件中有以下虚拟Scala代码test.scala:

class Transaction {
  def begin() {}
  def commit() {}
  def rollback() {}
}

object Test extends Application {
  def doSomething() {}

  val t = new Transaction()
  t.begin()
  try {
    doSomething()
    t.commit()
  } catch {
    case _ => t.rollback()
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我在Scala 2.8 RC1上编译它,scalac -Xstrict-warnings test.scala我将收到以下警告:

test.scala:16: warning: catch clause swallows everything: not advised.
    case _ => t.rollback()
    ^
one warning found
Run Code Online (Sandbox Code Playgroud)

所以,如果不建议使用catch-all表达式,那么我应该如何实现这样的模式呢?除此之外,为什么无论如何都不建议这样的表达?

Rex*_*err 9

警告存在是因为您可能不想捕获所有内容.例如,尝试捕捉任何东西通常是不可取的,java.lang.Error因为通常很难从这些东西中恢复过来.(如果你有另一个例外,你很可能被抛出你的拦截块.)

此外,因为您无法有效地捕获所有内容,所以这不是实现原子/故障安全事务的安全方法.你最好用类似的东西

try {
  t.commit()
} finally {
  if (!t.checkCommitted()) {
    t.rollback()
    if (!t.checkRolledback()) throw new FUBARed(t)
  }
}
Run Code Online (Sandbox Code Playgroud)

在阅读新内容时进行额外测试t以确保其处于合理状态.

  • 你可以`抓住{case _:Exception =>}`.`Error`是`Throwable`但不是'Exception` - 通常更好.如果你的意思是,"我不在乎我是否尝试并且没有抓住这个,我至少想要给它最好的机会",那么你可以接受(严格的)警告信息.这就是为什么它是一个警告,而不是一个错误. (5认同)