首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

finally 異常遮蓋缺陷:原始異常丟失風險

     編輯:Java 相關知識

現象演示

void f() throws VeryImportantException { throw new VeryImportantException(); }
void dispose() throws HoHumException { throw new HoHumException(); }

try { f(); } finally { dispose(); }

結果

僅輸出 HoHumException,VeryImportantException 被遮蓋丟失。

原因

finally 中拋出異常會取代傳播中的原始異常,導致關鍵錯誤資訊消失。

對比 C++

C++ 若在析構函數(相當於 finally)中拋出異常且當前已有未處理異常,會直接呼叫 terminate(),強制開發者處理。

規避建議

  • finally 僅做清理,勿拋出異常。
  • 清理代碼內部捕獲並記錄異常,不向外拋出。
  • Java 7+ try-with-resources 並支援 addSuppressed() 保留原始異常。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved