例外是跨層級報告錯誤的機制,所有錯誤資訊必須封裝在例外物件中。呼叫端透過 catch 不同例外型別執行差異化處理,因此庫作者應提供豐富的例外型別體系。
若僅拋出 Exception,呼叫端只能:
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 保留完整錯誤鏈,是專業庫開發者的基本修養。