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

Effective C# 原則 45:選擇強例外保證保護程式 (上)

     編輯:關於C語言

例外中斷控制流程,引入危機

拋出例外會中斷預期行為,清理工作留給捕獲者。C# 社群可直接套用 C++ 社群成熟的例外安全實踐(Tom Cargill、Herb Sutter、Scott Meyers 等人 1994-2000 年討論成果)。

三種例外安全保證等級

  1. 基本保證:無資源洩漏,所有物件保持可用狀態。.NET 執行階段管理記憶體,僅當例外發生時持有 IDisposable 資源才可能洩漏(參見原則 18)。
  2. 強保證:在基本保證基礎上,例外拋出後程式狀態不變。操作要么完成,要么如未開始般回滾。
  3. 不拋出保證:操作絕不失敗,絕不拋出例外。

強保證在恢復能力與簡單度間取得最佳平衡。

實踐強保證的模式

  1. 對可能修改的資料建立防禦性複本。
  2. 在複本上完成所有可能拋出例外的操作。
  3. 以不可失敗的交換操作(如參考指派)提交複本。

範例:薪資資料更新


public void PhysicalMove(string title, decimal newPay)
{
    // PayrollData 為 struct,建構子驗證欄位
    PayrollData d = new PayrollData(title, newPay, this.payrollData.DateOfHire);
    // 建構成功才交換
    this.payrollData = d;
}

何時妥協

  • 迴圈中大量物件複本效率過低時,可退回基本保證。
  • 例外必然導致程式終止時,無需強保證。

參考型別交換極廉價,傾向支援強保證。範例:DataSet 複本填充資料後原子交換 _data = tmp。

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