API 文档说永远不要捕获 Throwable 子类 Error 这表示异常行为。是不是暗示Error和Exception的分离是为了告诉程序员哪些子类应该被捕获,哪些不应该被捕获?或者还有更多?
最佳答案
通常,Error
是您无法想象处理的严重错误(通常在平台本身 内)。我唯一关心捕获 Error
的时间是为了记录它,然后我重新抛出。
这非常重要,因为很容易让错误(和运行时异常)以一种永远不会被记录的方式向上传播调用堆栈(例如,使用 executorService.submit(Runnable)
而没有监听返回的 Future
)
错误
通常是这样的:
- 内存不足
- 抽象方法错误(例如,运行的库版本与构建的库版本不同)
- 断言(即程序员定义的不变量,或永远不应该发生的事情 - 哈哈!)
然后我会说 RuntimeException
通常(但不总是)指示编程 错误:
- 不检查 null 或传入 null
- 传入无效参数,或允许无效状态
- 在迭代时修改集合
我通常也会推荐快速失败,但这是一个灰色地带;也许您在将用户输入传递给服务器之前不检查用户输入 - 几乎不值得让您的应用程序崩溃!
Checked Exception
(即非运行时)应该用于您可以合理预期发生并在您的代码中合理(或可以想象)处理的事情。我个人喜欢检查异常,但由于以相同方式处理不同异常类型(即在多个相同的 catch block 中)涉及冗长/重复,因此这些异常变得很麻烦。 Scala 等语言具有更好的 catch 语法,但随后它们也删除了checked 异常的概念!
关于java - Throwable 的哪个子类应该被捕获,哪些不应该被捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2146108/