l

2010年3月15日 星期一

敏捷式例外處理設計 (3):我到底哪裡做錯之 ignored checked exception

03/15 20:2821:00

以下的內容需要先閱讀『敏捷式例外處理設計的第一步:決定例外處理等級』比較容易理解。

今天 Teddy 要談另一個會導致程式無法達到 G1 (error-reporting) 例外處理等級的 exception handling bad smell: ignored checked exception 。請看以下 Java 程式片段:

public void doIt(){

  try {
       // Do IO operations
  }
  catch (IOException e) {
   // 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
  }
}



變成


public void doIt(){

  try {
     // Do IO operations
  }
  catch (IOException e) {
     throw new UnhandledException(“message”, e);
  }
}

如果上面的程式要達到 G2 或是 G3 還需要其他方法,暫且不表。


友藏內心獨白:昨天和今天這兩篇出場順序有點搞錯,應該先講 ignored checked exception 再講 dummy handler

沒有留言:

張貼留言