2 回答

TA貢獻(xiàn)1851條經(jīng)驗 獲得超3個贊
與直接調(diào)用 f 有什么不同嗎?
不。
即調(diào)用者可以通過檢查異常來檢測差異嗎?
不,因為此時您沒有構(gòu)造新的異常。堆棧跟蹤是在調(diào)用的位置構(gòu)建的new WhateverException(...)
(不是在調(diào)用位置的位置throw
,盡管它們通常位于同一位置)。
通常,如果由于異常而需要進(jìn)行一些清理,則可以重新拋出捕獲的異常:
try {
? // ...
} catch (SomeException e) {
? // Clean up resources.
? throw e;
}
調(diào)用堆棧展開時發(fā)生的事情對調(diào)用者來說既不可見也不相關(guān)。
快速演示可以顯示堆棧跟蹤是相同的,無論異常是被捕獲并重新拋出還是僅僅允許傳播。
使用 catchF 而不是 f 是否有任何明顯的開銷?
構(gòu)造異常的開銷將遠(yuǎn)遠(yuǎn)超過此冗余構(gòu)造的任何開銷。

TA貢獻(xiàn)1993條經(jīng)驗 獲得超6個贊
簡單地重新拋出并且不影響異常的已知類型的異常處理程序絕對沒有語義效果。
那么,理論上,編譯器或 JVM 可以優(yōu)化 try-catch out。在實踐中,我懷疑他們這樣做,因為這樣的代碼應(yīng)該很少見并且不在熱路徑上(永遠(yuǎn)不應(yīng)該有例外);實現(xiàn)這樣的優(yōu)化可能不值得付出努力。
添加回答
舉報