Feb. 14 09:17~10:42
早上一早起床,吃完早餐之後正愁今天不知道要寫什麼主題,無意中發現在2011年5~6月時Teddy寫了一系列的「Checked or unchecked exceptions」文章。這系列的文章還有兩篇沒完成,今天就來接這條斷掉的尾巴。
隔了快一年九個月,連Teddy自己都忘了之前寫些什麼。先幫鄉民們複習一下前三集的內容。
- 《Checked or unchecked exceptions (1)》:這一篇介紹Java語言的checked和unchecked exception的用途以及設計者所賦予這兩種例外類別的語意。在本篇文末Teddy留下了四個有待回答的問題。
- 《Checked or unchecked exceptions (2)》:這一篇回答了第一個問題:「雖說 checked exceptions for recoverable conditions,但是為什麼偏偏當程式中遇到一個 checked exception 的時候鄉民們卻打死也不知道要如何去recover(修復)任何東東?舉個最常見的checked exception—IOException—為例,處理檔案、stream、socket 都會『附贈』IOException,收到這份大禮之後該怎麼辦?沒人知道。」
- 《Checked or unchecked exceptions (3)》:這一篇跳針,跳過第二個問題先回答第三個問題:「Checked exception要宣告在method的signature上,所以如果一個 method會丟出去的checked exception數目或是型別改變了,那個這個method的signature也變了,也就是說interface也變了。改變介面這件事可不是好玩滴...」
***
今天要談的是第二個問題:
既然checked exception要符合handle-or-declare rule,但是鄉民們既不知道如何handle,也不明白如何declare。Exception這麼多,怎麼處理?那就亂處理啊!所以程式中經常可以看到catch and ignore(exception被捕捉且被忽略)或是blindly declare(盲目地將所有發生的checked exception都宣告在method上面繼續往外丟)。
上面這段話所描述的問題又可以細分為以下兩個子問題,今天先談第一個子問題:
- 如何處理例外
- 如何宣告例外
如何處理例外
Teddy在《Checked or unchecked exceptions (2)》提到過,在程式中收到一個例外的時候,要考慮下列幾個因素才能決定要如何設計處理例外:
- Exception Type
- Recoverability
- Application Context
- Robustness Level
- Exception Handling Policy (Strategy)
不知如何處理例外,通常是上述這五個因素沒有弄清楚所導致的。例如,請問在程式中收到一個IOExceptione該如何處理?答案是:不知道。因為當程式捕捉到IOException的時候,只知道Exception Type這個資訊。再進一步探討,IOException是Java內建的checked exception,從語意上來說代表一種可復原的錯誤(recoverable error)。上面這五個因素只得其二,所以還是無法決定要如何設計例外處理程式。
接下來鄉民們要參考軟體架構,看看這個例外是在整個系統的哪一層或是哪一個區塊被捕抓到的,且該處是否有足夠的「Application Context」來判斷這個例外要如何處理。有了前三項資訊之後,鄉民們便可決定程式的Robustness Level(強健度等級,請參考《敏捷式例外處理設計的第一步:決定例外處理等級》) ,依據這個Robustness Level來選擇不同的Exception Handling Policy 。例如,如果Robustness Level等於Level 1: Error-reporting (錯誤回報),則Exception Handling Policy便可選擇直接將例外往上丟(如果捕捉到的是checked exception則先轉成unchecked exception之後再往外丟。)
以上內容在《Checked or unchecked exceptions (2)》有較為詳細的說明,鄉民們可參考之。不知如何處理例外的問題根源Teddy再強調一次,就是要同時考慮Exception Type、Recoverability、Application Context、Robustness Level、Exception Handling Policy這五個因素,缺一不可。
***
本篇需要「複習」的資訊有點多,怕鄉民們腦袋overflow今天就先寫到這裡,關於「如何宣告例外」留待下集待續。最後補充說明一點,「C.C. Agile 」二月份聚會Teddy要分享的內容就是從這一系列文章中所擷取出來的。由於活動場地有限,對此主題有興趣但沒有報到名的鄉民們,可參考搞笑談軟工部落格上的本系列文章(Teddy內心獨白:當然還聽本人解釋藥效更佳啊)。
***
友藏內心獨白:今天是西洋情人節,有人說情人節和清明節一樣,不是送吃就是送花。好強的抽象化能力啊。
沒有留言:
張貼留言