【问题标题】: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.")
        }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-27
        • 2014-12-01
        • 2023-01-31
        相关资源
        最近更新 更多