【问题标题】:Scala: what are the guarantees of the catch Throwable?Scala:catch Throwable 的保证是什么?
【发布时间】:2019-02-10 01:04:12
【问题描述】:
我想知道以下模式的保证:
try {
//business logic here
} catch {
case t: Throwable =>
//try to signal the error
//shutdown the app
}
我有兴趣捕获所有意外异常(可能由任何框架、库、自定义代码等引发),尝试记录错误并关闭虚拟机。
在 Scala 中,catch Throwable 异常的保证是什么? java Exception 层次结构有什么不同需要考虑吗?
【问题讨论】:
标签:
scala
exception-handling
throwable
【解决方案1】:
Throwable 定义在JVM spec:
Java 虚拟机中的异常由类 Throwable 或其子类之一的实例表示。
这意味着 Scala 和 Java 共享 Throwable 的相同定义。实际上,scala.Throwable 只是 an alias 对应于 java.lang.Throwable。因此,在 Scala 中,处理 Throwable 的 catch 子句将捕获由封闭代码引发的所有异常(和错误),就像在 Java 中一样。
需要考虑的 java Exception 层次结构有什么不同吗?
由于 Scala 使用与 Java 相同的 Throwable,因此 Exception 和 Errors 代表相同的事物。唯一的“区别”(我知道)是在 Scala 中,有时会在后台使用异常来进行流控制,因此如果您想捕获非致命异常(因此不包括错误),您应该使用 @987654323 @ 而不是 catch e : Exception。但这不适用于直接捕获 Throwable
【解决方案2】:
所有无害的Throwables都可以被以下人员捕获:
try {
// dangerous
} catch {
case NonFatal(e) => log.error(e, "Something not that bad.")
}
这样,您就永远不会捕获一个合理的应用程序不应该尝试捕获的异常。