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

C# 異常處理完整指南:從基礎到自定義異常

     編輯:關於C#

一、System.Exception 核心屬性

屬性說明
Message異常原因與內容描述
Source拋出異常的組件名稱
StackTrace方法呼叫堆疊追蹤
InnerException包裹的內部異常(鏈結)
TargetSite擲回異常的方法
HelpLink說明連結
Data自訂鍵值對資料

二、try-catch-finally 結構

try
{
    // 可能拋出異常的代碼
}
catch (SpecificException ex)
{
    // 處理特定異常
}
catch (Exception ex)
{
    // 處理其他所有 Exception 衍生異常
}
catch // 不帶參數
{
    // 捕獲非 Exception 衍生異常(極罕見,如非託管代碼 SEH)
}
finally
{
    // 無論是否發生異常必定執行(資源釋放、清理)
}

關鍵規則

  • catch 與 finally 可選,但至少須有一個。
  • 一個 try 可對應多個 catch,但只能有一個 finally。
  • finally 區塊一定會執行(含 return、throw、執行緒中止等情況)。
  • 捕獲順序:具體異常在前,基底 Exception 在後。

三、異常傳播機制

異常未被捕獲時,沿呼叫堆疊向上傳遞,直到找到匹配 catch 或到達進程入口點。若最終未捕獲,CLR 顯示未處理異常對話框/記錄事件日誌。

四、拋出異常

1. throw 變數

throw new ArgumentNullException(nameof(id), "ID 不可為空");

必須是 Exception 或其衍生類型。

2. 重新拋出

catch (Exception ex)
{
    Log(ex);
    throw; // 保留原始堆疊追蹤
    // 錯誤:throw ex; // 會重設堆疊追蹤至當前行
}

五、自定義異常最佳實務

設計原則

  1. 避免深層繼承階層。
  2. 繼承 System.Exception 或常見基底異常(ArgumentException、InvalidOperationException 等)。
  3. 類別名以 Exception 結尾。
  4. 實作 [Serializable] 支援序列化(跨 AppDomain/遠端)。
  5. 至少實作四個標準建構子。

標準自定義異常範本

[Serializable]
public class MyBusinessException : Exception
{
    public MyBusinessException() { }
    
    public MyBusinessException(string message) : base(message) { }
    
    public MyBusinessException(string message, Exception inner) : base(message, inner) { }
    
    protected MyBusinessException(SerializationInfo info, StreamingContext context) : base(info, context) { }
    
    // 可選:擴充屬性
    public int ErrorCode { get; set; }
    public string UserMessage { get; set; }
}

Visual Studio 代碼片段

編輯器輸入 Exception 按 Tab Tab 自動產生上述範本。

六、異常處理黃金法則

原則說明
僅捕獲可處理的異常捕獲後無法恢復/記錄/轉換則不應捕獲,讓上層處理
不要用異常控制流程異常成本高,業務邏輯判斷用 if/return
保留堆疊追蹤重新拋出用 throw; 而非 throw ex;
釋放資源用 using/finally確保非記憶體資源(檔案、連線、鎖)釋放
提供有意義的 Message包含足夠上下文資訊供診斷
區分預期/非預期異常預期異常(驗證失敗)用自定義型別;非預期(Bug)讓它冒泡
全域未處理異常記錄AppDomain.UnhandledException、TaskScheduler.UnobservedTaskException、ASP.NET Core 中介軟體

七、常見內建異常類型速查

異常適用情境
ArgumentException參數不符合預期(含 ArgumentNullException、ArgumentOutOfRangeException)
InvalidOperationException物件狀態不適合該操作(如集合修改中枚舉)
NotSupportedException不支援的功能
NotImplementedException尚未實作
ObjectDisposedException操作已釋放物件
TimeoutException操作逾時
IOExceptionI/O 錯誤
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved