這對我來說很奇怪。 RuntimeException
繼承自Exception
,其繼承自Throwable
。爲什麼不捕獲異常catch runtimeException?
catch(Exception exc) { /* won't catch RuntimeException */
但
catch(Throwable exc) { /* will catch RuntimeException */
我知道RuntimeException
是它的選中特殊。但根據我的理解,這隻適用於是否要聲明例外,而不是它們是否被捕獲。即使如此,我不知道爲什麼這個邏輯會突破Throwable。
這與我很相關,因爲我有一種情況,RuntimeExceptions可以在終端操作中拋出。我不確定這個模式的名字,但是像我的類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)
,我認爲這是一個語法錯誤,因爲繼承?
重讀我的代碼。這是正確的。由於運行時異常來自「if(results.foo.bar()){/ * apply callback * /}」,它是一個NPE,所以我的絕緣層很麻煩。 – djechlin
@djechlin:你的帖子不會*顯示*'if(results.foo.bar())' - 現在還不清楚你到底要問什麼...... –