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

C# 異常處理完整指南

     編輯:關於C語言

C# 異常處理機制核心知識體系

系統性整理 C# 異常處理的類別結構、捕獲語法、傳播機制、主動拋出與自訂異常最佳實踐。

一、System.Exception 核心屬性

屬性說明
Message異常原因與內容描述
Source拋出異常的組件名稱
StackTrace方法調用堆疊追蹤
InnerException包裹的內部異常 (鏈式異常)

二、try-catch-finally 語法與規則

try {
    // 可能拋出異常的代碼
}
catch (ExceptionType1 ex) {
    // 處理特定異常
}
catch (ExceptionType2 ex) {
    // 處理另一類異常
}
finally {
    // 無論是否發生異常必定執行 (資源釋放、清理)
}

關鍵規則:

  • catch 無參數 vs catch(Exception):前者捕獲所有異常 (含非 CLS 合規),後者僅捕獲繼承自 Exception 的異常
  • 一個 try 可對應多個 catch,但只能有一個 finally
  • catch 與 finally 至少要有一個
  • finally 區塊無論如何都會執行 (含 return、throw 情況)

三、異常傳播機制

未被捕獲的異常沿呼叫堆疊向上傳遞,直到:

  1. 遇到匹配的 catch 區塊
  2. 傳遞至最頂層進入點
  3. 由 CLR 顯示未處理異常對話框

四、主動拋出異常

// 1. 拋出異常實例
throw new ArgumentNullException("paramName");

// 2. 重新拋出當前捕獲的異常 (僅限 catch 區塊內)
catch (Exception ex) {
    Log(ex);
    throw;  // 保留原始堆疊追蹤
}

注意:throw ex; 會重設堆疊追蹤,失去原始錯誤位置資訊,應使用 throw;。

五、自訂異常最佳實踐

  1. 避免深層繼承體系
  2. 繼承 System.Exception 或常見基礎異常類別
  3. 類別命名以 Exception 結尾 (如 BusinessRuleException)
  4. 實作序列化支援 (跨應用程式域傳遞)
  5. 至少實作四個標準建構函式:
    public MyException() {}
    public MyException(string message) {}
    public MyException(string message, Exception inner) {}
    protected MyException(SerializationInfo info, StreamingContext context) {}
    
  6. Visual Studio 片段:輸入 Exception + Tab 自動生成樣板
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved