2017-04-17 58 views
5

我對這兩個主題非常不確定。我知道我應該使用multi-catch來處理需要以相同方式處理的異常。但爲了什麼目的,我真的需要這樣的東西。何時使用多捕獲和何時使用rethrow?

private void something(String name) throws IOException, RemoteException { 
    try { 
     ... 
    } catch (Exception ex) { 

     ... // do something 

     throw ex; 
    } 
} 
+1

儘管使用泛型異常是一種不好的做法。見[這裏](http://stackoverflow.com/questions/2416316/why-is-the-catchexception-almost-always-a-bad-idea)。 – Enzokie

+0

這個問題既不明確,也不以意見爲基礎? –

回答

3

,如果你考慮這種方法,它的執行過程中引發的任何異常應以同樣的方式進行處理,並且希望讓異常傳播到客戶機

之前執行的任務你可以做到這一點例如,假設您想在發生異常時執行特定的處理,例如記錄信息。所以你抓住它來完成這項任務。
儘管如此,你認爲被捕獲的異常是一個問題,並且記錄它不是一個「真正的」異常處理。所以,你讓它通過重新推廣來傳播。

+0

好的,謝謝。但我可以再問一個問題嗎?讓我們假設一個NullPointerException被拋出並拋出。這個異常是否會被拋出到調用方法,因爲在throws子句中只提到了IO-和RemoteException?來自德國的問候 – LaBlum

+0

不客氣。非常有趣的問題。 'NullPointerException'是一個'RuntimeException'。這種異常不需要在方法聲明中明確聲明。你可以拋出它而不捕捉它或聲明該方法爲拋出它。與被檢查異常的'IOException'和'RemoteException'相反。這些最後只從'Exception'派生而不是'RuntimeException'。 – davidxxx

+0

這是真的......我沒有考慮到這一點。如果拋出IllegalArgumentException,會發生什麼,例如,因爲我想將一個String存儲在一個int變量中?無論如何,它會被拋到調用方法中,儘管在throws子句中沒有提到它嗎? – LaBlum

3

重新拋出

每當你要通知例外來電者的方法,你趕上並重新拋出異常。

說一些方法callSomething()正在調用你的方法something()。如果something()內部發生任何異常,它只會捕獲異常,所以應用程序不會失敗,並將其重新引發到callSomething()方法。然後callSomething()會通知客戶有關內部錯誤。

另外一個例子是,在MVC模式中,客戶端提交的請求是通過控制器基於請求映射的某種方法服務的。控制器將調用服務,服務將與dao的某種方法進行交互。如果在DAO中發生了某種異常,那麼DAO會將異常重新引發到服務中,服務將重新引發到控制器,並且它會通知客戶端有關錯誤消息的控制器。 這被稱爲在java中的異常傳播一個異常從一個方法傳播到另一個方法,調用堆棧,直到它被捕獲到

多抓

如果你想爲多種類型的異常進行同樣的動作,那麼你用多抓。

2

你需要重新拋出在下列情況下,

  1. 你想要的東西預處理讓異常離開方法之前。但是,如果您不關心異常的類型,那麼也可以在finally塊中完成預處理。
  2. 您試圖將檢查的異常轉換爲未經檢查的異常。在這種情況下,您將捕獲所有例外,如catch(Exception ex)並將它們重新投射爲throw new RuntimeException(ex)
  3. 您希望拋出自定義異常而不是內置異常。所以你會捕獲所有的異常,然後創建你自己的異常對象,最好不選中並拋出。許多API都是這樣做的,例如Spring將異常的JDBC異常轉換爲Spring自定義異常。
  4. 這是一種有點像預處理。你想跟蹤通過創建一個ArrayList或其他東西引發的所有異常,以便在多步驟程序結束時知道哪些步驟會拋出異常。我已經看到這個被用於生成Java代碼的Talend