首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 異常處理核心:throw 與 try-catch 的區別、使用場景與最佳實踐

     編輯:程式設計綜合問答

C# 中 throw 用於**拋出**異常,try-catch 用於**捕獲並處理**異常。兩者分工明確,配合使用構建健壯的錯誤處理體系。本文透過實例說明何時用哪個。

核心區別速查

關鍵字角色執行流向典型使用場景
throw拋出者向上傳遞,尋找最近的 catch驗證失敗、守護條件不滿足、重新拋出
try-catch捕獲者攔截異常,執行恢復/記錄邏輯外部呼叫、資源釋放、轉換為業務異常
finally清理者無論是否異常皆執行關閉檔案、釋放連線、歸還鎖

經典範例:年齡屬性驗證

public class Person {
    private int _age;
    public int Age {
        get => _age;
        set {
            if (value < 0)
                throw new ArgumentOutOfRangeException(nameof(value), "年齡不可為負數");
            _age = value;
        }
    }
}

// 呼叫端捕獲處理
try {
    person.Age = -5;  // 觸發 throw
} catch (ArgumentOutOfRangeException ex) {
    Log.Error(ex.Message);
    MessageBox.Show("輸入錯誤:" + ex.Message);
}

何時使用 throw?

  1. 前置條件驗證:方法進入點檢查參數合法性(ArgumentNullException, ArgumentOutOfRangeException)。
  2. 業務規則違反:庫存不足、權限不足、狀態機非法轉換 → 拋出自訂異常 InsufficientStockException。
  3. 重新拋出:catch 記錄日誌後 throw; 保留堆疊追蹤,讓上層決定最終處理。
  4. 異常轉換:捕獲底層 SqlException → 包裝為 DataAccessException 拋出,隱藏實作細節。

何時使用 try-catch?

  1. 邊界呼叫:Main、Controller Action、事件處理器、背景工作執行緒入口。
  2. 資源管理:using 區塊隱式 try-finally;手動管理時需 try { } finally { resource.Dispose(); }。
  3. 預期內的失敗:網路請求超時、檔案不存在、JSON 解析失敗 → 轉為友善提示或重試。
  4. 全域異常處理:ASP.NET Core UseExceptionHandler、WinForms Application.ThreadException、WPF DispatcherUnhandledException。

反模式警示

反模式問題改進
捕獲 Exception 後吞沒掩蓋真實錯誤,難以除錯至少記錄日誌,或僅捕獲具體異常型別
用異常控制正常流程效能差、語意不清用布林返回值、TryParse 模式、Option/Maybe 型別
throw ex; 而非 throw;丟失原始堆疊追蹤永遠用 throw; 重新拋出

自訂異常最佳實踐

[Serializable]
public class BusinessException : Exception {
    public string ErrorCode { get; }
    public BusinessException(string code, string message) : base(message) {
        ErrorCode = code;
    }
    public BusinessException(string code, string message, Exception inner) 
        : base(message, inner) { ErrorCode = code; }
    protected BusinessException(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { }
}

總結:throw 是「發現問題、拋出問題」,try-catch 是「面對問題、解決問題」。合理分工,讓異常在正確層級被處理,是寫出可維護 C# 程式的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved