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

时间:2010-01-27 10:37:10

标签: java try-catch throwable

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

2 个答案:

答案 0 :(得分:6)

一般来说,Error是严重错误的(通常在平台本身中),这是您无法想象的。我唯一一次关心捕捉Error是为了记录它,然后再重新抛出。

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

Error通常是这样的:

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

我会说RuntimeException通常(但并不总是)指示编程错误:

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

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

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

答案 1 :(得分:4)

是的,我认为您的分析在这里是正确的 - 您不应该捕获Error因为它们代表无法恢复的运行时错误,例如OutOfMemoryError

捕获Throwable的唯一原因是,如果您正在运行程序正确操作所不需要的外部第三方代码 - 如果您不信任该代码,请抓住所有内容,如果您获得你没想到的东西(Throwable)然后禁用该代码并报告它。

也可以区分ExceptionRuntimeException