scala - 为什么在 NonFatal.scala 中 LinkageError 是致命的

标签 scala error-handling

我在看 scala.util.control.NonFatal .我找不到来源,但我相信它类似于 this .

他们宣布LinkageErrorFatal ...

Tomcat(至少最近几年我使用它)总是在 catch Throwable 上返回 500 ,而不是在某些类型的错误上崩溃。许多其他系统也是如此,它们尽最大努力始终将某些东西返回给客户。

所以,我的最终问题是你什么时候使用 NonFatal而不是尽最大努力提供一些回应?

例如,现在 future in Twitter's Future library最终无法解决 NoSuchMethodError所以我的Future不再通过 Throwable 解析为失败而是抛出堆栈(与 RuntimeException 不同)。事实上,在开源的 Finagle 堆栈中,有一个 NoSuchMethodError将导致客户端套接字连接在客户端关闭,并且没有 500 http 错误返回给客户。客户然后认为“嗯,可能是网络问题......为什么我的套接字关闭了”

到目前为止,它只给我带来了问题,我承认有点沮丧,但需要对更多用例持开放态度。多年来,KISS 和对待每一个 Throwable总而言之,非致命的已经奏效了,但是 NonFatal暗示有些用例我们应该做一些不同的事情。

最佳答案

source codeNonFatal链接自 API docs .

fatal error 是您的系统或 JVM 很可能无法正确恢复 ,所以捕捉这些错误不是一个好主意。
LinkageError 的子类是:ClassCircularityError , ClassFormatError , ExceptionInInitializerError , IncompatibleClassChangeError , NoClassDefFoundError , UnsatisfiedLinkError , VerifyError .当您的类路径损坏、存在无效或二进制不兼容的类文件时,这些都会发生。如果这些发生在运行时,可以安全地假设您的整个系统都损坏了。

回答这个问题:你应该“让它崩溃”。始终使用 NonFatal当您需要一个包罗万象的子句时进行模式匹配。它也会帮你忙并处理控制流相关异常 正确(例如 NonLocalReturnControl )。

请注意,与您链接到的旧源不同,StackOverflowError不再是非致命的,该决定在 Scala 2.11 中根据 SI-7999 进行了修订.

关于scala - 为什么在 NonFatal.scala 中 LinkageError 是致命的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29540650/

相关文章:

scala - 如何在 Scala 中排除/重命名某些类的导入?

json - 使用 Spray-json 在 SCALA 中解析复杂的 JSON

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

javascript - 如何处理 ETIMEDOUT 错误?

function - 在 Scala 中,为什么我们在定义方法时需要 "="?

scala - 未找到 : object akka?

scala - 是否可以覆盖类型字段?

php - 有没有一种方法可以将PHP错误常量映射到其名称(或易于理解的名称)?

java - Java 新手 : Constructor error control

ionic-framework - 在 Windows 10 上安装 ionic 和 cordova