Scala:catch Throwable 的保证是什么?

Scala: what are the guarantees of the catch Throwable?

我想知道以下模式的保证:

try {
  //business logic here
} catch {
  case t: Throwable =>
    //try to signal the error
    //shutdown the app
}

我有兴趣捕获所有意外异常(可以由任何框架、库、自定义代码等抛出),尝试记录错误并关闭虚拟机。

在 Scala 中,捕获 Throwable 异常的保证是什么?与要考虑的 java 异常层次结构有什么区别吗?

Throwable定义在JVM spec:

An exception in the Java Virtual Machine is represented by an instance of the class Throwable or one of its subclasses.

这意味着 Scala 和 Java 共享相同的 Throwable 定义。事实上,scala.Throwable 只是 an alias 对应 java.lang.Throwable。因此在 Scala 中,处理 Throwable 的 catch 子句将捕获所有由封闭代码抛出的异常(和错误),就像在 Java.

中一样

There are any difference with the java Exception hierarchy to take in consideration?

由于 Scala 使用与 Java 相同的 Throwable,异常和错误表示相同的事物。唯一的 "difference"(据我所知)是在 Scala 中,有时会在后台使用异常来进行流量控制,因此如果你想捕获 non-fatal 异常(因此排除错误),你应该而是使用 而不是 catch e : Exception。但这不适用于直接捕获 Throwable

所有无害的 Throwable 都可以通过以下方式捕获:

  try {
    // dangerous
  } catch {
    case NonFatal(e) => log.error(e, "Something not that bad.")
  }

这样,您就永远不会捕获到合理的应用程序不应尝试捕获的异常。