【发布时间】:2013-10-10 10:28:30
【问题描述】:
这对我来说很奇怪。 RuntimeException继承自Exception,后者继承自Throwable。
catch(Exception exc) { /* won't catch RuntimeException */
但是
catch(Throwable exc) { /* will catch RuntimeException */
我知道RuntimeException 的特殊之处在于它没有被选中。但据我了解,这仅适用于是否必须声明异常,而不是它们是否被捕获。即便如此,我也不知道为什么这个逻辑会在捕获Throwable 时中断。
这与我非常相关,因为我有一种情况,可以在终端操作中抛出 RuntimeException。我不确定这种模式的名称,但类似于我的课程EmailRoller 采用Callbacks 的数组。代码如下所示:
for(Callback cb : callbacks) {
try {
cb.call(item);
}
catch(Exception exc) {
logger.error("Error in callback: ", exc);
}
}
因此,这是一种需要通过 OOME 之类的东西的情况,因为如果其中一个回调消耗了所有机器内存,那肯定会影响其他回调的运行。但是NullPointerException?还是IndexOutOfBoundsException?这些会影响回调,但不会阻止其他的运行。
另外,这有点像企业设计。不同的程序员或团队可以添加回调来处理项目,但它们应该相互隔离。这意味着,作为负责将这些回调相互隔离的程序员,我不应该依赖它们来确保错误不会漏掉。捕捉Exception 应该是正确的路线,但这不是因为RuntimeException 滑过。所以我更一般的问题是:这里有什么好的模式?只是catch(Exception | RuntimeException exc),我认为是因为继承的语法错误?
【问题讨论】:
-
您应该编辑问题标题 - 如果有人只看标题,他们会认为捕获异常不会捕获运行时异常。
-
@AlexCiminian 好点。这是另一个 8 年的信息性问题!
标签: java exception runtimeexception