我想知道以下模式的保证:
try {
//business logic here
} catch {
case t: Throwable =>
//try to signal the error
//shutdown the app
}
我有兴趣捕获所有意外的异常(可以被任何框架,库,自定义代码等抛出......),尝试记录错误并关闭虚拟机。
在Scala中,捕获Throwable异常的保证是什么?是否与java Exception层次结构有任何不同?
答案 0 :(得分:3)
Throwable
在JVM spec:
Java虚拟机中的异常由类
Throwable
的实例或其子类之一表示。
这意味着Scala和Java共享相同的Throwable定义。事实上,scala.Throwable
仅java.lang.Throwable
catch
。因此在Scala中,处理Throwable的catch e : Exception
子句将捕获所附的代码抛出的所有异常(和错误),就像在Java中一样。
要考虑java异常层次结构有什么不同吗?
由于Scala使用与Java相同的Throwable,因此异常和错误代表相同的事物。唯一的“差异”(我知道)是在Scala中,有时会在流量控制下使用异常,因此如果要捕获非致命异常(从而排除错误),则应该使用{{ 3}}而不是apply
。但这并不适用于直接捕捉Throwable
答案 1 :(得分:0)
所有无害的可扔物都可以被以下物体捕获:
try {
// dangerous
} catch {
case NonFatal(e) => log.error(e, "Something not that bad.")
}
这样,您永远不会遇到一个合理的应用程序不应尝试捕获的异常。