Mar. 28 20:59~21:56

今天下午到北科大資工所專題演講課程給個talk,題目是:Bad Smells and Refactorings of Java Exception Handling Design。
Teddy首先介紹了幾個常見的例外處理壞味道(exception handling bad smells),包含:
- Ignored checked exception
- Unprotected main program
- Dummy handler
- Nested try block
- Spare handler
接著說明透過以下例外處理重構方法來移除上述幾個例外處理壞味道:
- Replaced ignored checked exception with unchecked exception
- Avoid unexpected termination with big outer try block
- Replace dummy handler with rethrow
- Replace nested try block with method
- Introduce checkpoint class
- Introduce resourceful try clause

在分享的過程中Teddy問了好幾個問題,原本以為都沒有人會答對,沒想到當Teddy問了下面這個問題時,居然有一位學生答對了
。請問下面這段例外處理程式(寫在catch裡面的程式瑪),這種寫法有什麼問題?鄉民們不妨也一起來猜猜看。

答案揭曉:在catch clause中提供alternative方法(替代方案),相當於retry(重試)一次原本try clause裡面primary方法。但這種例外處理的寫法,只能retry一次,如果要retry很多次,就會產生好幾層的nested try block,而nested try block是一種例外處理壞味道。
所以Teddy建議套用Introduce Resourceful Try Clause這個例外處理重構方法把程式改成下面這個樣子:

***
例外處理重構到底有沒有用,在2006年Teddy做這個研究的時候,有一位碩士班學弟(在職生,在業界有多年的工作經驗)利用這個方法重構了一個正在使用的銀行授信系統。以下是重構之後的成本效益分析。
在重構之前,先收集一下這個系統在2005年的時候由使用者回報的錯誤前三名,並統計各項問題發生的次數。

這是例外處理重構之後連續觀察四個月的結果,實驗證明原本系統不穩定的問題已經被解決了。

不包含註解該系統原本有14150行程式,例外處理重構動到了371行程式。原本系統有855個catch clause,例外處理重構動到了其中的21個。簡單的說,大概只動到原本系統不到3%的程式碼,便可有很好的強健度改善成效。
把成效換算成金錢,一年最保守估計至少省下36,100 USD(1百零8萬新台幣)的維護費用。

***
演講投影片放在「搞笑談軟工Facebook」,有需要的鄉民們請自行下載服用。
***
友藏內心獨白:例外處理真的不好搞啊。