2012-05-22 64 views
1

有幾個ChildException catch塊和一個Exception catch塊之間有什麼更好?通過更好,我的意思是在一個很好的做法的方式幾個「ChildException」catch塊versius一個「Exception」catch塊

舉例說明:

public static void main(String[] args) { 
    System.out.println(Main.isNonsense1(null)); // false <- bad 
    System.out.println(Main.isNonsense2(null)); // NullPointerException <- good 
} 

// More readable, less precise 
public static boolean isNonsense1(String className) { 
    try { 
     Class.forName(className); 
     String.class.getConstructor(String.class); 
     className.getBytes("UTF-8"); 
     MessageDigest.getInstance("SHA-1").wait(); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 

// Less readable, more precise 
public static boolean isNonsense2(String className) { 
    try { 
     Class.forName(className); 
     String.class.getConstructor(String.class); 
     className.getBytes("UTF-8"); 
     MessageDigest.getInstance("SHA-1").wait(); 
     return true; 
    } catch (ClassNotFoundException e) { 
     return false; 
    } catch (NoSuchMethodException e) { 
     return false; 
    } catch (SecurityException e) { 
     return false; 
    } catch (UnsupportedEncodingException e) { 
     return false; 
    } catch (NoSuchAlgorithmException e) { 
     return false; 
    } catch (InterruptedException e) { 
     return false; 
    } 
} 
+0

如果你想要的只是返回false,那麼不要麻煩自己來專門處理這些情況。 – ron

回答

4

這涉及到這樣一個問題:Catch multiple exceptions at once?

答案很好。關鍵在於,如果你抓住了Exception,那麼你應該處理你知道的每個案例,其餘的都應該處理。也就是說,只需在您的示例中捕獲Exception並返回false將而不是是個不錯的主意。你可能無意中發現了一些你並不想要的異常。

使用你的例子,這裏是我的推薦代碼:

public static boolean isNonsense2(String className) { 
    try { 
     Class.forName(className); 
     String.class.getConstructor(String.class); 
     className.getBytes("UTF-8"); 
     MessageDigest.getInstance("SHA-1").wait(); 
     return true; 
    } catch (Exception e) { 
     if (e instanceof ClassNotFoundException 
       || e instanceof NoSuchMethodException 
       || e instanceof SecurityException 
       || e instanceof UnsupportedEncodingException 
       || e instanceof NoSuchAlgorithmException 
       || e instanceof InterruptedException) { 
      return false; 
     } else { 
      throw e; 
     } 
    } 
} 
+0

謝謝,好主意''''''''' – sp00m

+0

''''''''''''''''''''''''我也應該警告,這樣做的一個缺點是編譯器不會再警告你,如果你正在處理**檢查異常**不能被'try'塊中的代碼拋出。 – Luke

1

我覺得沒有完全明確的答案。在你的情況我想這樣的代碼是:

public static boolean isNonsense1(String className) { 
    if(slassname==null) throw new IllegalArgumentException("className must not be null"); 
    try { 
     Class.forName(className); 
     String.class.getConstructor(String.class); 
     className.getBytes("UTF-8"); 
     MessageDigest.getInstance("SHA-1").wait(); 
     return true; 
    } catch (ClassNotFoundException e) { 
     throw new IllegalArgumentException("provided class " + className + " not found"); 
    } catch (Exception e) { 
     return false; 
    } 
} 

對於我的口味,扔NullPointerException總是不好的,這就是爲什麼我扔IllegalArgumentException

0

如果你不感興趣的處理異常(你應該按照最佳做法)不明確的漁獲麻煩。能夠處理特定異常的整個意義在於使您能夠正確處理它們。