斯卡拉:捕获Throwable的保证是什么?

时间:2018-03-25 11:21:34

标签: scala exception-handling throwable

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

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

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

在Scala中,捕获Throwable异常的保证是什么?是否与java Exception层次结构有任何不同?

2 个答案:

答案 0 :(得分:3)

ThrowableJVM spec

中定义
  

Java虚拟机中的异常由类Throwable的实例或其子类之一表示。

这意味着Scala和Java共享相同的Throwable定义。事实上,scala.Throwablejava.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.")
  }

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