API doc说永远不会捕获 Throwable 子类错误,这表示异常行为。这是否意味着Error和Exception之间的隔离是告诉程序员应该捕获哪个子类,哪个不应该?还是还有更多呢?
答案 0 :(得分:6)
一般来说,Error
是严重错误的(通常在平台本身中),这是您无法想象的。我唯一一次关心捕捉Error
是为了记录它,然后再重新抛出。
这非常重要,因为很容易让错误(和运行时异常)以不会记录它们的方式传播到调用堆栈中(例如,使用executorService.submit(Runnable)
而不监听返回的Future
})
Error
通常是这样的:
我会说RuntimeException
通常(但并不总是)指示编程错误:
我通常会建议在这些方面快速失败,但这是一个灰色区域;也许你在将用户输入传递给服务器之前不会检查用户输入 - 这非常值得让你的应用程序崩溃!
检查Exception
s(即非运行时)应该用于您可以合理预期会发生并合理地(或可想象地)处理代码的内容。我个人喜欢检查异常,但由于以相同的方式处理不同的异常类型(即在多个相同的catch块中)所涉及的冗长/重复,这些都变得很麻烦。像Scala这样的语言有更好的捕获语法,但随后它们也删除了已检查异常的概念!
答案 1 :(得分:4)
是的,我认为您的分析在这里是正确的 - 您不应该捕获Error
因为它们代表无法恢复的运行时错误,例如OutOfMemoryError
。
捕获Throwable
的唯一原因是,如果您正在运行程序正确操作所不需要的外部第三方代码 - 如果您不信任该代码,请抓住所有内容,如果您获得你没想到的东西(Throwable
)然后禁用该代码并报告它。
也可以区分Exception
和RuntimeException
。