这对我来说很奇怪。RuntimeException
继承自Exception
,继承自Throwable
。
catch(Exception exc) { /* won't catch RuntimeException */
但
catch(Throwable exc) { /* will catch RuntimeException */
我知道RuntimeException
它的特别之处在于它是未经检查的。但据我了解,这仅适用于是否必须声明异常,而不是它们是否被捕获。即使那样,我也不知道为什么这种逻辑会在 catch 时中断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)
,我认为这是因为继承的语法错误?