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

Effective C# 原則 45:採用強式例外保證,打造健壯程式

     編輯:關於C#

拋出例外會中斷控制流程,若能在管理狀態的代碼中捕獲並恢復,系統更穩健。C++ 社群經六年(1994-2000)驗證出三級例外安全保證,C# 應全盤採用。

三級保證

  1. 基本保證:無資源洩漏,所有物件保持可用狀態。.NET 執行期預設即提供(託管記憶體自動回收),僅需注意 IDisposable 資源(參見原則 18)。
  2. 強式保證:建立在基本保證之上,操作失敗時程式狀態完全不變。捕獲例外後可像從未嘗試操作般繼續執行,恢復最簡單。
  3. 無拋出保證:操作絕不失敗,決不拋出例外。適用於解構函式、Dispose、委派目標等特殊情境。

實作強式保證:複製-修改-交換模式

public void PhysicalMove(string title, decimal newPay) {
    // 1. 被動式複製(建構新值物件,驗證失敗會拋例外)
    PayrollData d = new PayrollData(title, newPay, this.payrollData.DateOfHire);
    // 2. 修改完成無例外,3. 原子性交換(值類型單指令,不拋例外)
    this.payrollData = d;
}

參考類型交換陷阱

交換參考類型會導致持有舊參考的用戶端看到過期資料。範例:

private DataSet _data;
public IListSource MyCollection => _data;

public void UpdateData() {
    DataSet tmp = _data.Clone() as DataSet;
    // ... 填充 tmp ...
    _data = tmp; // 交換參考,舊 DataSet 仍被外部持有
}

解決:使用 DataSet.Merge 合併變更至現有實例,保持外部參考有效:

_data.Merge(tmp); // 原地更新,所有參考同步看到新資料

原則 6 建議優先使用值類型,交換模式對值類型最有效。

無拋出保證的必要場景

  • 解構函式/Dispose:拋出例外會中止清理流程,導致資源洩漏;
  • 委派/事件處理器:多播委派中一個目標拋出例外,後續目標不會被呼叫。建議委派目標內部捕獲並處理例外,但不可假設其他開發者也會遵守(防禦性程式設計)。

總結

強式例外保證是錯誤恢復與簡單性的最佳平衡點。採用「複製-修改-交換」模式,謹慎處理參考類型交換,確保解構/釋放/委派不拋出例外,即可構建經得起例外衝擊的健壯系統。

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