Verity Stob
什麼是「把屍體釘在站立位置」#
作者曾寫過一篇諷刺性的 C++ 測驗,建議了一種「例外處理策略」:
藉由在整個程式碼庫中大量使用
try...catch,我們有時能防止應用程式崩潰。我們將這種結果稱為「把屍體釘在站立位置」(nailing the corpse in the upright position)。
這個玩笑其實來自作者的真實慘痛經驗。他們有一個自製的 C++ 基礎應用程式類別,經過多年來許多程式設計師的修改,已經沒有人完全理解它。團隊決定這個類別的實例要麼永遠存活,要麼在嘗試中死去。
過度例外處理的災難#
為了達成目標,他們做了以下事情:
- 交織使用多重例外處理器(exception handlers)
- 混合使用 Windows 結構化例外處理與原生的
__try...__except - 當事情出乎意料地失敗時,重新呼叫並加壓參數
- 在
catch子句內嵌套內層的try...catch
結果是:每當基於此類別的應用程式出了問題,它們就像黑手黨受害者沉入碼頭一樣消失,不留下任何有用的線索,堆疊傾印(dump routines)也無法記錄災難。
最終團隊認清了現實,用一個最小但健全的錯誤回報機制取代了整個混亂的設計。這個改變大幅減少了後續的崩潰次數。
不要在原地「烹煮」例外#
作者在網路上與人爭論時,對方是一位學者,主張 Java 遠端交易中的程式碼如果失敗,應該就地攔截並封鎖例外(catch and block the exception in situ)。作者反問:「攔截之後你要拿它怎麼辦?煮來當晚餐嗎?」
該學者引用了 UI 設計師的規則:永遠不要讓使用者看到例外報告。但這並不意味著要把錯誤吞掉不處理。
過度使用
try...catch來隱藏錯誤,只會讓問題更難診斷。正確的做法是建立一個健全的錯誤回報機制,而不是把程式釘在「看似正常運作」的狀態。