l

2007年6月30日 星期六

例外處理 (1)

兩、三個月前Teddy買了一支具有GPS導航功能的PDA手機。在新鮮感還沒消失之前,Teddy在網路上到處尋找關於PDA手機的資料。其中有人提到,使用這類的PDA手機 (執行 Windows Mobile OS),過一陣子就要幫它「插屁屁」。因為這些裝置相對於PC比較容易當機 (不知是應用軟體沒寫好,還是作業系統不穩),所以經常需要 reset有些機種將 reset 按鈕設計在機體的下方為了避免使用的人不小心按到 reset 按鈕,所以 reset 按鈕都設計成凹進去的,需要用觸控筆尖尖的那一端來碰觸 reset 按鈕。

用了沒多久之後,Teddy強烈感受到
「插屁屁」的必要性。為什麼PDA手機這麼容易當機 ?! 好像時空倒轉,回到當年那 Windows 3.0/3.1 藍底白字的時代,需要不斷的按下 reset 按鈕。

軟體出問體導致電腦當機的原因當然很多,其中有一項常見的現象,就是
忽略例外 (ignoring exceptions)。妥善的處理在程式中所發生的例外 (exceptions),將可增強軟體系統的強固性 (robustness)。簡單的說,就是寫出來的軟體比較不容易「當」。但是,例外處理 (exception handling) 在軟體開發中,一直是個被忽略的一環。對許多程式設計師而言,開發功能需求 (functional requirements) 的時間都不夠了,哪來的閒工夫來設計例外處理。

耶,那麼當程式遇到例外時該怎麼辦 ? 你可能會想,
嘿嘿,很簡單的啦。只要把例外捉起來 (catch) 然後直接忽略不就好的啦 (有點窩藏犯人的嫌疑)。反正寫程式的是我,我不講老闆也不會知道的啦 。」稍微負責一點的程式設計師可能會把補抓到的例外寫到 log 中,直接列印出來,或是交給程式最外圍 (通常是啟動該程式的函數,例如 main,或是某個 thread ) 的物件來處理。

好把,就算你是一位有理想、有抱負的程式設計師,打算大展身手好好修理一下這些在程式中不請自來的不速之客,但是,要怎麼做 ? 這時候你可能用力回想一下,距今N年前的學生時代,有什麼課有教我們例外處理? 耶,好像沒有。沒關係,身為一位
有理想、有抱負的程式設計師,身邊隨時帶著幾本程式語言的書也是很正常的。先翻翻 VB這一本,再看看 C# 這一本,還有C++ Java。奇怪,怎麼好像除了把這個燙手山芋 (例外) 往外丟 (re-throw),或是直接印到 console 上,就沒什麼特別的處理方法了。 此時,你內心吶喊著:「萬能的天神,請賜予我神奇的力量,讓我好好地處理這些該死的例外吧!」

日後Teddy將撰寫一系列有關例外處理的文章。這個主題是Teddy博士論文研究的一部份,其實裡面也沒什麼偉大的理論,不過是將現今分散在不同學科中,關於例外處理的方法做一些整理。以下列出一些參考文獻,這些資料對於如何
處理例外有很實際的建議,有興趣的人可以找來看一下。

參考資料
  1. J. Bloch, Effective Java Programming Language Guide, Prentice Hall PTR, 2001.
  2. J. Shore, “Fail Fast,” IEEE Software, vol. 21, no. 5, 2004, pp. 21-25.
  3. S. Stelting, Robust Java: Exception Handling, Testing and Debugging, Prentice Hall PTR, 2005.
  4. R. Wirfs-Brock, “Designing for Recovery,” IEEE Software, vol. 23, no. 4, July/August 2006, pp.11-13.
  5. R. Wirfs-Brock, “Toward Exception-Handling Best Practices and Patterns,” IEEE Software, vol. 23, no. 5, Sep./Oct. 2006, pp.11-13.

沒有留言:

張貼留言