在 Java 異常處理中,有時需要一個「安全網」捕獲所有可能的異常。透過捕獲基底類別 Exception 即可達成,但須注意順序與資訊提取技巧。本文將說明捕獲所有異常的正確寫法、Throwable 提供的核心診斷方法,並附上完整範例輸出。
Exception 是幾乎所有應用層異常的共同父類(Error 除外)。寫法如下:
try {
// 可能拋出各種異常的程式碼
} catch (Exception e) {
System.out.println("caught an exception");
// 處理邏輯
}
關鍵規則:此捕獲區塊必須置於所有具體異常捕獲之後,否則後續的 catch (IOException e) 等將永遠無法執行(被父類別攔截)。
捕獲到 Exception e 後,可透過繼承自 Throwable 的方法提取詳細資訊:
| 方法 | 回傳值 | 用途 |
|---|---|---|
getMessage() | String | 取得詳細錯誤訊息(建構子傳入的字串) |
toString() | String | 簡短描述:類別名 + 冒號 + 訊息(若有) |
printStackTrace() | void | 印出完整堆疊追蹤至標準錯誤輸出 (System.err) |
printStackTrace(PrintStream s) | void | 印出至指定串流(如 System.out 便於重導向) |
getCause() | Throwable | 取得導致此異常的原始原因(異常鏈) |
getStackTrace() | StackTraceElement[] | 程式化存取堆疊框架,適合自訂日誌格式 |
此外,繼承自 Object 的 getClass() 可取得異常的確切執行期類別,配合 getName() 可動態判斷型別。
public class ExceptionMethods {
public static void main(String[] args) {
try {
throw new Exception("Here's my Exception");
} catch (Exception e) {
System.out.println("Caught Exception");
System.out.println("e.getMessage(): " + e.getMessage());
System.out.println("e.toString(): " + e.toString());
System.out.println("e.printStackTrace():");
e.printStackTrace();
}
}
}
執行輸出:
Caught Exception
e.getMessage(): Here's my Exception
e.toString(): java.lang.Exception: Here's my Exception
e.printStackTrace():
java.lang.Exception: Here's my Exception
at ExceptionMethods.main(ExceptionMethods.java:7)
觀察可見:getMessage() 僅回傳訊息字串,toString() 包含類別名,printStackTrace() 則提供完整呼叫堆疊,資訊層層遞增。
Windows 環境下 System.err 難以重導向至檔案。建議使用:
e.printStackTrace(System.out); // 或 new PrintStream(new File("error.log"))
若寫 catch (Throwable t) 會連 Error(如 OutOfMemoryError)也捕獲,通常不建議,除非在頂層框架做最後防禦性記錄。捕獲 Exception 已涵蓋 99% 應用層需求。
catch 在前,catch (Exception e) 在後e.printStackTrace() 或 log.error("", e)toString()/堆疊給開發者除錯throw e 或包裝後拋出,交由上層統一處理熟練運用 Exception 捕獲與 Throwable 診斷方法,能讓你的錯誤處理既全面又資訊豐富。