N 層架構下,同一異常被 Servlet、Facade、Client 三層各自 printStackTrace,日誌淹沒在重複堆疊中。本文確立「自定義異常拋出前打印一次,上層僅轉換不再捕獲」原則,並設計 errorCode 機制實現用戶友好錯誤提示,附完整代碼示例。
// Servlet
catch (MyAppEx e) { e.printStackTrace(); }
// Facade
catch (DaoEx e) { e.printStackTrace(); throw new MyAppEx(); }
// Client
catch (SoapFault e) { e.printStackTrace(); throw new MyAppEx(); }
// 結果:同一錯誤在日誌出現 3 次完整堆疊
// 自定義異常攜帶錯誤碼
public class MyAppException extends Exception {
private final int errorCode;
public MyAppException(int code, Exception cause, Object... args) { super(cause); this.errorCode = code; }
public int getErrorCode() { return errorCode; }
}
// Servlet 統一轉換
catch (MyAppException e) {
String msg = switch (e.getErrorCode()) {
case WS_CONNECT_FAIL -> "無法連線外部系統,請聯繫管理員";
case DUPLICATE_EXPORT -> "重複匯出數據";
default -> "系統暫時不可用,請稍後再試";
};
renderError(msg);
}