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

Effective C# 原則 44:建立應用程式專屬例外類別,提升錯誤處理精度

     編輯:關於C#

例外是跨層級報告錯誤的機制,所有錯誤資訊必須封裝在例外物件中。呼叫端透過 catch 不同例外型別執行差異化處理,因此庫作者應提供豐富的例外型別體系。

為何需要自訂例外?

若僅拋出 Exception,呼叫端只能:

  1. 直接中止/掛起(用戶體驗差);
  2. 解析 TargetSite.Name 等脆弱資訊判斷錯誤來源(重構即失效)。

提供專屬例外型別,呼叫端即可撰寫清晰、穩健的 catch 區塊:

try { Foo(); Bar(); }
catch (MyFirstAppException e) { FixProblem(e); }
catch (AnotherAppException e) { ReportErrorAndContinue(e); }
catch (YetAnotherAppException e) { ReportErrorAndShutdown(e); }
catch (Exception e) { ReportGenericError(e); }

設計原則

  • 僅當「不同錯誤需要不同恢復行為」時才建立新例外型別;
  • 所有自訂例外應繼承 System.ApplicationException(而非 Exception),利於分類捕獲;
  • 完整實作四大建構函式:預設、訊息、訊息+內部例外、序列化;
  • 善用 InnerException 保留原始錯誤堆疊,實現「例外轉譯」:將底層例外包裝為含業務語意的高層例外。

實作範例

public class MyAssemblyException : ApplicationException {
    public MyAssemblyException() : base() { }
    public MyAssemblyException(string s) : base(s) { }
    public MyAssemblyException(string s, Exception e) : base(s, e) { }
    protected MyAssemblyException(SerializationInfo info, StreamingContext ctx) : base(info, ctx) { }
}

// 例外轉譯
public double DoSomeWork() {
    try { return ThirdPartyLibrary.ImportantRoutine(); }
    catch (Exception e) {
        throw new DoingSomeWorkException($"Problem with {this}", e);
    }
}

總結

自訂例外類別能大幅提升診斷與修復效率。遵循「行為差異化」原則建立型別體系,完整實作建構函式,善用 InnerException 保留完整錯誤鏈,是專業庫開發者的基本修養。

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