2012-11-14 108 views
18

我有一個聲明,引發了很多檢查異常。我可以添加所有catch塊的所有的人都像這樣:是否有可能捕獲除運行時異常外的所有異常?

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(IOException ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} catch(ClassCastException ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} catch... 

我不喜歡這一點,因爲他們都在處理相同的方式,以便有一種重複的代碼,也有大量的代碼編寫。相反,能趕上Exception

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 

這將是確定的,但我希望所有運行時異常被丟棄而不被卡住。有沒有解決這個問題的方法?我在想,要捕捉的異常類型的一些聰明的泛型聲明可能會訣竅(或者可能不會)。

回答

40

你可以做到以下幾點:

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(RuntimeException ex) { 
    throw ex; 
} catch(Exception ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 
+2

很好的答案... +1 – Juvanis

+2

+1很酷。不是我見過的最乾淨的,但是有訣竅。 – drasto

11

如果你可以使用Java 7,你可以使用一個Multi-Catch

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(IOException|ClassCastException|... ex) { 
    throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
} 
+0

+1警告我Java 7中這個新的有價值(且已逾期的IMO)功能 –

+0

+1由於這個原因,我會盡可能使用Java 7。但我不能,我很抱歉,因爲這種Multi-Catch是完美的。我必須使用Java 6:(((( – drasto

1

你可以嘗試這樣的事情,基本上趕上一切,然後如果它是該類的實例,則重新拋出RuntimeException ...

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    if (ex instanceof RuntimeException){ 
     throw ex; 
    } 
    else { 
     throw new MyCustomInitializationException("Class Resolver could not be initialized.", ex); 
    } 
} 

眼見彷彿這將是凌亂寫一遍又一遍(和壞的可維護性),我的代碼可能會轉移到不同的等級,這樣的事情...

public class CheckException { 
    public static void check(Exception ex, String message) throws Exception{ 
     if (ex instanceof RuntimeException){ 
      throw ex; 
     } 
     else { 
      throw new MyCustomInitializationException(message, ex); 
     } 
    } 
} 

而且用它你這樣的代碼......

try { 
    methodThrowingALotOfDifferentExceptions(); 
} catch(Exception ex) { 
    CheckException.check(ex,"Class Resolver could not be initialized."); 
} 

注意到我們通過在message,使我們仍然可以自定義我們的MyCustomInitializationException

+0

)如果我需要多次執行它,最後一個選項會很好,但這不是我的情況 - 我只需要使用它一次。只有我將String的參數化爲靜態方法'message。 – drasto

+0

你需要在代碼中將'ex'轉換爲'RuntimeException'。 –