自定義異常基類設計
public class BException : ApplicationException {
private string _errMsg = "";
public BException() : base() {}
public BException(string msg) : base(msg) { _errMsg = msg; }
public override string Message => _errMsg;
public static BException CreateError(string msg) {
var st = new StackTrace();
var sf = st.GetFrame(1); // 呼叫者幀
var mi = sf.GetMethod();
var t = mi.DeclaringType;
return new BException($"Error in {t.Name}::{mi.Name} -- {msg}");
}
public override string ToString() => _errMsg;
}
核心亮點
- StackFrame 精準定位調用者:`GetFrame(1)` 獲取調用 `CreateError` 的方法,自動拼裝「類名::方法名 -- 錯誤信息」,免去手動傳遞上下文。
- 統一錯誤信息格式:全項目調用 `BException.CreateError("具體原因")`,拋出即攔截,日誌/顯示格式一致。
ASP.NET 全局攔截示例
protected override void OnError(EventArgs e) {
var bex = Server.GetLastError().GetBaseException() as BException;
if (bex != null) {
Response.Write($"");
Server.ClearError(); // 必須清除,否則黃頁
return;
}
base.OnError(e);
}
優勢總結
- 消除返回值/out 參數傳遞錯誤信息的繁瑣與遺漏。
- 調用者無需記憶各方法錯誤碼含義,統一 try-catch 或全局攔截。
- StackFrame 自動上下文,錯誤定位零成本。