4

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

4

2 回答 2

7

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

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

Errors 通常是这样的:

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

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

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

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

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

于 2010-01-27T10:46:48.023 回答
4

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

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

此外,区分Exception和可能是个好主意RuntimeException

于 2010-01-27T10:42:09.343 回答