03/15 20:28~21:00
以下的內容需要先閱讀『敏捷式例外處理設計的第一步:決定例外處理等級』比較容易理解。
今天 Teddy 要談另一個會導致程式無法達到 G1 (error-reporting) 例外處理等級的 exception handling bad smell: ignored checked exception 。請看以下 Java 程式片段:
以下的內容需要先閱讀『敏捷式例外處理設計的第一步:決定例外處理等級』比較容易理解。
今天 Teddy 要談另一個會導致程式無法達到 G1 (error-reporting) 例外處理等級的 exception handling bad smell: ignored checked exception 。請看以下 Java 程式片段:
public void doIt(){
try {
// Do IO operations
}
catch (IOException e) {
// ignored
}
} // ignored
}
所謂的 ignored check exception表示例外被捕捉但是沒有作任何的處裡,換句話說就是例外被『忽略』或是『隱藏』了。Ignored check exception 和 dummy handler 對程式狀態造成的影響其實是很類似的,但是由於兩者『表現的方式不同』(在程式碼中長得不一樣),所以還是將其紀錄成兩個不同的 smells。
相同點:
- Caller 無法得知 callee是否發生了例外。
- 都無法達到 G1。
相異點:
- 當錯誤發生的時候,ignored check exception 比 dummy handler 還難偵錯。因為前者連將例外輸出到 console 的動作也沒有,所以當程式狀態錯誤時更難找到問題。
- 到看到程式碼的時候,dummy handler 會讓 programmers 誤以為例外已經妥善處裡,但是 ignored check exception 比較容易被看出來是一個問題。
*******
Replace Ignored Checked Exception with Unchecked Exception
只要套用Replace Ignored Checked Exception with Unchecked Exception 這個 refactoring 就可以移除 ignored checked exception 並達到 G1 例外處理等級。實做方法和移除 dummy handler 其實很像,都是丟出一個 RuntimeException 來取代原本的例外,請看:
public void doIt(){
try {
// Do IO operations
}
catch (IOException e) {
// ignored
}
} // ignored
}
變成
public void doIt(){
try {
// Do IO operations
}
catch (IOException e) {
throw new UnhandledException(“message”, e);
}
} throw new UnhandledException(“message”, e);
}
如果上面的程式要達到 G2 或是 G3 還需要其他方法,暫且不表。
友藏內心獨白:昨天和今天這兩篇出場順序有點搞錯,應該先講 ignored checked exception 再講 dummy handler。
沒有留言:
張貼留言