2015-04-07 66 views
1

我有一個負責記錄操作的包裝器,名爲OperationWrapper。其結構簡單,並且如下:立即重新陷入catch塊並最終使用

public void runOperation(Operation o) throws Exception{ 
    logOperationStarted(); 
    o.execute(); 
    logOperationFinished(); 
} 

由於「o」的操作可以拋出異常,logOperationFinished()方法不會總是被調用,因而記錄操作不正確。

此外,調用runOperation()方法的各種組件處理這些異常。

已經想確保logOperationFinished()將始終運行,我實現了以下結構:

public void runOperation(Operation o) throws Exception{ 
    logOperationStarted(); 
    try{ 
     o.execute(); 
    } 
    catch(Exception e){ 
     throw e; 
    } 
    finally{ 
     logOperationFinished(); 
    } 
} 

現在logOperationFinished()並始終運行,但我正在逐漸從的IntelliJ警告:夾縫

立即重新排除異常
報告任何捕獲塊,其中捕獲的異常爲無需對其執行任何操作,立即重新生成。這樣的 catch塊是不必要的或缺乏錯誤處理。

對我來說,似乎IntelliJ在發出此警告時沒有考慮到finally塊。

我做錯了什麼或有沒有更好的方法來實現這一目標?

謝謝。

+0

爲什麼你抓住它開始,如果你只是要扔掉它?這不像你直接對異常做任何事情。 (另外,它很差*練習抓住'Exception' - 儘量避免出現這種情況。) – Makoto

回答

1

使用嘗試-最後從JLS 14.20.2. Execution of try-finally

方框如果try塊執行任何其他原因ř突然完成,則最後塊被執行,那麼就一個選擇:

  1. 如果finally塊正常完成,那麼try由於原因S,因爲原因S突然完成,所以try語句突然完成(並且原因R被丟棄)。

public void runOperation(Operation o) throws Exception{ 
    logOperationStarted(); 
    try{ 
     o.execute(); 
    }finally{ 
     logOperationFinished(); 
    } 
} 

如果你想使用try-catch-finally程序還是沒有問題的,你可以忽略的IntelliJ警告,或者從catch塊拋出新的異常。

throw new ExceptionYouWantToThrow(e); 
5

是的,你不需要抓

public void runOperation(Operation o) throws Exception{ 
    logOperationStarted(); 
    try{ 
     o.execute(); 
    } 
    finally{ 
     logOperationFinished(); 
    } 
} 
+0

雖然這屬於Java基礎知識,但有時最短的解決方案是最好的。 「你不需要捕獲」就像它可以得到的那樣清晰簡明。 Sumit Singh接受的解決方案可能是有效的,但您的方法很快並且沒有IF A THEN B邏輯。謝謝! – tresf

0

是例外的意思是可以恢復?如果不是,則拋出錯誤可能是合適的,而不是重新拋出異常。

可怕的袋熊的答案是最有可能的,但你在之後。

throw new Error(e); 

Exception vs Error