l

2013年12月13日 星期五

例外處理壞味道(上)

Dec. 12 20:20~20:40

image

 

Teddy之前曾經零星介紹過幾個例外處理壞味道,這次分上、下兩集把這些壞味道整理一下,統一介紹給鄉民們。

***

Return Code(回傳碼)

使用return code來代表例外狀況是由來已久的一種程式設計習慣,尤其是學過C語言的鄉民們,因為C語言沒有支援例外,因此慣用特殊的函數回傳值來表達錯誤狀況。下列程式片段顯示用return code來表達錯誤狀況的例子,如果withdraw()回傳值-1,則表示提款錯誤。

螢幕快照 2013-12-12 下午8.23.38

 

使用return code來表達錯誤狀況有兩個主要的問題,首先處理正常邏輯的程式和處理異常邏輯的程式交錯在一起,導致程式不易閱讀與修改。其次,開發人員很可能會忽略對於return code的檢查,因此導致錯誤被忽略,降低系統的強健度並且增加除錯的困難度。

下列程式片段顯示一個使用withdraw()的例子,第4~6行程式碼用來檢查錯誤狀況,第7~9行用來處理正常狀況。因為使用了return code來代表錯誤,因此正常與錯誤程式碼穿插在一起,無法被清楚的區分。

螢幕快照 2013-12-12 下午8.25.41

***

Ignored Checked Exception(忽略受檢例外)

忽略例外等於隱藏潛在問題,會降低系統的強健度並且增加除錯的困難度。Ignored Checked Exception是專屬Java語言的壞味道,開發人員為了逃避Java語言對於checked exception所規範的handle-or-declare rule,因此很容易寫出捕捉checked exception之後將其忽略的程式,如下列程式片段6~8行所示,捕捉並忽略了FileNotFoundException以便通過Java編譯器的語法檢查。

螢幕快照 2013-12-12 下午8.28.24  

***
Ignored Exception(忽略例外)
Ignored Exception是和Ignored Checked Exception形式相近但產生目的不同且和Java語言無關的壞味道。有些開發人員因為不知道如何處理例外,深怕自己所寫的程式一但丟出例外,可能會被其他團隊成員質疑。或是有意無意之間為了隱藏自己所寫的程式可能會產生的問題,因此寫出如下列程式片段所示的程式碼,將自己所寫的函數都用一個try statement包起來,然後搭配一個catch(Throwable e)捕捉並忽略所有的例外。
螢幕快照 2013-12-12 下午8.30.22
還是那句老話:忽略例外等於隱藏潛在問題,會降低系統的強健度並且增加除錯的困難度。

***

Unprotected Main Program(未被保護的主程式)

未被捕捉的例外一直往上傳遞,最終傳到主程式或執行緒身上。如下列程式片段所示,Teddy稱其為Unprotected Main Program,如果主程式或執行緒沒有捕捉由下傳遞至自己身上的例外,表示程式或執行緒會不預期的終止執行。使用者會認為這種不預期的程式終止是一種軟體品質不佳的表現。

螢幕快照 2013-12-12 下午8.32.00 


***


友藏內心獨白:自己的程式碼,也有這些臭臭的味道嗎?

沒有留言:

張貼留言