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.")
}
这样,您就永远不会捕获到合理的应用程序不应尝试捕获的异常。
我想知道以下模式的保证:
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.")
}
这样,您就永远不会捕获到合理的应用程序不应尝试捕获的异常。