我应该在 EventDispatcher/Observable 中捕获 Exception、Throwable 还是其他
Should I catch Exception, Throwable or other in EventDispatcher/Observable
通常 not recommended 捕获一般异常,如 Exception
或 Throwable
,因为你承担了处理你不知道如何处理的问题的负担(比如内存不足错误)。但是,在 "robust" 观察者模式实现中(一个监听器的错误不应阻止其他监听器被通知),事件发布者可能会被 任何人 观察到,这意味着事件监听器可能会抛出事件发布者不可能知道的异常(这就是解耦监听器和发布者的全部意义)。
在这种情况下,捕获Throwable
是否有意义,这样无论事件处理中发生什么错误,其他侦听器仍会得到通知?或者抓住这样一个通用的 class 仍然是个坏主意吗?
像这样
for (EventHandler listener : listeners) {
try {
listener.sendEvent(event);
} catch (Throwable exc) {
log.warn("Listener " + listener + " failed to process event");
//maybe remove faulty listener...
}
}
我可以看到另一个更重要的隔离侦听器失败的方法是使用线程池,这样如果一个侦听器抛出异常,只有池中的线程会丢失,但其他侦听器的通知仍然会发生
我建议抓住 Throwable
,因为我发现你的论点是确凿的 “任何人都可以观察到事件发布者,这意味着事件监听器可能会抛出事件发布者不可能知道的异常”.
备选方案是不捕获任何东西,这将是一场噩梦,或者您建议的线程池,我认为当您捕获 Throwable
.
时,线程池是不必要的
通常 not recommended 捕获一般异常,如 Exception
或 Throwable
,因为你承担了处理你不知道如何处理的问题的负担(比如内存不足错误)。但是,在 "robust" 观察者模式实现中(一个监听器的错误不应阻止其他监听器被通知),事件发布者可能会被 任何人 观察到,这意味着事件监听器可能会抛出事件发布者不可能知道的异常(这就是解耦监听器和发布者的全部意义)。
在这种情况下,捕获Throwable
是否有意义,这样无论事件处理中发生什么错误,其他侦听器仍会得到通知?或者抓住这样一个通用的 class 仍然是个坏主意吗?
像这样
for (EventHandler listener : listeners) {
try {
listener.sendEvent(event);
} catch (Throwable exc) {
log.warn("Listener " + listener + " failed to process event");
//maybe remove faulty listener...
}
}
我可以看到另一个更重要的隔离侦听器失败的方法是使用线程池,这样如果一个侦听器抛出异常,只有池中的线程会丢失,但其他侦听器的通知仍然会发生
我建议抓住 Throwable
,因为我发现你的论点是确凿的 “任何人都可以观察到事件发布者,这意味着事件监听器可能会抛出事件发布者不可能知道的异常”.
备选方案是不捕获任何东西,这将是一场噩梦,或者您建议的线程池,我认为当您捕获 Throwable
.