java - Throwable 的哪个子类应该被捕获,哪些不应该被捕获?

标签 java try-catch throwable

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/

相关文章:

swift - 有没有一种方法可以使用Swift的 `try?`获取引发的错误消息?

java - 如何循环 try catch 语句?

java - 不能抛出 Exception 类型的异常,异常类型必须是 Throwable 的子类

java - 我该如何修复 'No exception of type SomeException can be thrown; an exception type must be a subclass of Throwable'

java - 如何使用 org.apache.commons.codec.binary.base64 对 Java 对象进行 Base64 编码?

java - Java for 循环中的列表列表

java - 使用批处理文件执行Jar中的Main类

java - 如何使用 Log4j 将日志消息计数发送到 Graphite?

python - 捕获生成器内的错误并随后继续

java - 运行用户提供的代码的控件库是否应该拦截异常或 Throwable?