应该抓住哪个Throwable的子类,哪个不应该?

Rav*_*pta 4 java try-catch throwable

API doc说从不捕获Throwable子类Error表示异常行为.这是否意味着Error和Exception之间的隔离是告诉程序员应该捕获哪个子类,哪个不应该?或者还有更多呢?

oxb*_*kes 6

一般来说,Error是一个严重错误的东西(通常在平台本身内)是你无法想象的.我唯一关心捕捉的Error是为了记录它,之后我重新投掷.

这非常重要,因为很容易让错误(和运行时异常)以一种永远不会记录它们的方式传播到调用堆栈中(例如executorService.submit(Runnable),在不监听返回的情况下使用Future)

Errors通常是这样的:

  • 内存不足
  • 抽象方法错误(例如,针对不同版本的库运行而不是构建的库)
  • 断言(即程序员定义的不变量,或者应该永远不会发生的事情 - 哈哈!)

然后我会说RuntimeExceptions通常(虽然不总是)表示编程错误:

  • 不检查null,或传入null
  • 传入无效参数或允许无效状态
  • 在迭代时修改集合

我通常会建议在这些上快速失败,但这是一个灰色区域; 也许你在将用户输入传递给服务器之前不检查用户输入 - 这值得崩溃你的应用程序!

Checked Exception(即非运行时)应该用于您可能合理预期会发生并合理(或可想象)处理代码的内容.我个人喜欢检查异常,但由于以相同方式处理不同异常类型所涉及的冗长/重复(即在多个相同的catch块中),这些异常繁琐.像Scala这样的语言有更好的捕获语法,但随后它们也删除了检查异常的概念!