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 來隱藏錯誤,只會讓問題更難診斷。正確的做法是建立一個健全的錯誤回報機制,而不是把程式釘在「看似正常運作」的狀態。