系統性整理 C# 異常處理的類別結構、捕獲語法、傳播機制、主動拋出與自訂異常最佳實踐。
| 屬性 | 說明 |
|---|---|
| Message | 異常原因與內容描述 |
| Source | 拋出異常的組件名稱 |
| StackTrace | 方法調用堆疊追蹤 |
| InnerException | 包裹的內部異常 (鏈式異常) |
try {
// 可能拋出異常的代碼
}
catch (ExceptionType1 ex) {
// 處理特定異常
}
catch (ExceptionType2 ex) {
// 處理另一類異常
}
finally {
// 無論是否發生異常必定執行 (資源釋放、清理)
}
關鍵規則:
catch 無參數 vs catch(Exception):前者捕獲所有異常 (含非 CLS 合規),後者僅捕獲繼承自 Exception 的異常try 可對應多個 catch,但只能有一個 finallycatch 與 finally 至少要有一個finally 區塊無論如何都會執行 (含 return、throw 情況)未被捕獲的異常沿呼叫堆疊向上傳遞,直到:
catch 區塊// 1. 拋出異常實例
throw new ArgumentNullException("paramName");
// 2. 重新拋出當前捕獲的異常 (僅限 catch 區塊內)
catch (Exception ex) {
Log(ex);
throw; // 保留原始堆疊追蹤
}
注意:throw ex; 會重設堆疊追蹤,失去原始錯誤位置資訊,應使用 throw;。
System.Exception 或常見基礎異常類別Exception 結尾 (如 BusinessRuleException)public MyException() {}
public MyException(string message) {}
public MyException(string message, Exception inner) {}
protected MyException(SerializationInfo info, StreamingContext context) {}
Exception + Tab 自動生成樣板