觀察大量程式碼後發現,開發者對錯誤處理普遍存在兩極傾向:完全忽略,或過度捕獲卻缺乏實質處理。本文分析這兩種反模式,並提出務實的錯誤處理策略。
認為程式碼已考慮所有情況,實際上永遠不可能預測所有意外。常見被忽略場景:
結論:防禦性程式設計必須假設錯誤會發生。
在每個程序加上 On Error GoTo / try-catch,僅彈出 MsgBox 或寫入日誌,然後繼續執行或直接返回。問題:
真正的錯誤處理包含三層次:
| 原則 | 說明 |
|---|---|
| 邊界攔截,核心拋出 | 核心邏輯拋出型別化例外,邊界層統一轉換為使用者訊息或 API 錯誤碼。 |
| 例外分類 | 區分「預期業務例外」(如餘額不足)與「系統級例外」(如資料庫離線),處理策略不同。 |
| 保留堆疊 | throw; 而非 throw ex;,或包裝 new AppException("msg", innerEx)。 |
| Finally 釋放資源 | 非受管理資源務必在 finally 或 using 區塊釋放。 |
| 避免吞沒 | 除非有明確恢復邏輯,否則不要空 catch { }。 |
| 日誌分級 | 業務例外記錄 Warn,系統例外記錄 Error/Fatal,含相關上下文參數。 |
錯誤處理的藝術在於在正確層級攔截、以正確方式恢復或中止。既不盲目樂觀忽略錯誤,也不機械性地到處 try-catch 卻無實質處理。建立分層例外策略,配合契約式設計與資源管理模式,才能構建健壯、可維護的系統。