2012-05-24 54 views
33

可能重複:
Is it possible to detect if an exception occurred before I entered a finally block?在finally塊,我可以告訴大家,如果一個異常被拋出

我有做事的工作流的方法,並拋出如果一個異常發生了錯誤。我想將報告指標添加到我的工作流程中。在下面的finally代碼塊中,是否有任何方法可以判斷try/catch塊中的某個方法是否引發異常?

我可以添加我自己的catch/throw代碼,但寧願更乾淨的解決方案,因爲這是我在整個項目中重複使用的模式。

@Override 
public void workflowExecutor() throws Exception { 
    try { 
     reportStartWorkflow(); 
     doThis(); 
     doThat(); 
     workHarder(); 
    } finally { 
     /** 
     * Am I here because my workflow finished normally, or because a workflow method 
     * threw an exception? 
     */ 
     reportEndWorkflow(); 
    } 
} 
+1

這個問題可能與所提出的問題重複,但很難說明,因爲另一個問題相當令人吃驚地錯綜複雜。在finally塊內確定塊是在正常的控制流程內執行還是由於拋出異常而執行的功能將非常有用,因爲它可以簡化事務處理;唉,Java和C#都不提供這種能力afaik。恥辱。 –

回答

47

沒有Java提供的自動方式。你可以使用一個布爾標誌:

boolean success = false; 
try { 
    reportStartWorkflow(); 
    doThis(); 
    doThat(); 
    workHarder(); 
    success = true; 
} finally { 
    if (!success) System.out.println("No success"); 
} 
3

你在那裏是因爲你的try-block已經完成執行。是否拋出異常。

要當異常發生之間還是你的方法流程執行順利完成區別,你可以嘗試做這樣的事情:

boolean isComplete = false; 
try 
{ 
    try 
    { 
    reportStartWorkflow(); 
    doThis(); 
    doThat(); 
    workHarder(); 
    isComplete = true; 
    } 
    catch (Exception e) 
    {} 
} 
finally 
{ 
    if (isComplete) 
    { 
    // TODO: Some routine 
    } 
} 
5

兩種解決方案:在catch塊調用reportEndWorkflow兩次,一次和一次的try結束:

try { 
    // ... 
    reportEndWorkflow("success"); 
} catch (MyException ex) { 
    reportEndWorkflow("failure"); 
} 

或者你可以引入一個布爾變量:

boolean finished = false; 
try { 
    // ... 
    finished = true; 
} finally { 
    // ... 
} 
相關問題