2012-05-24 6 views
33

가능한 중복 :
Is it possible to detect if an exception occurred before I entered a finally block?는 알 수

내가 일을 워크 플로우 방법이 있고,이 경우 예외가 발생합니다 오류가 발생했습니다. 내 작업 흐름에보고 메트릭을 추가하고 싶습니다. 아래 finally 블록에서 try/catch 블록의 메서드 중 하나가 예외를 throw했는지 알 수있는 방법이 있습니까?

내 자신의 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 블록 내에서 블록이 정상적인 제어 흐름 내에서 실행되는지 또는 예외 발생으로 인해 실행되는지를 결정하는 기능은 트랜잭션 처리를 단순화하므로 매우 유용합니다. 아아, 자바도 C#도 현재이 능력을 제공하지 못합니다. 부끄러움. –

답변

47

Java에서 제공하는 자동 방법이 없습니다. 부울 플래그를 사용할 수 있습니다.

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

try 블록이 실행을 완료 했으므로 참석하게됩니다. 예외가 발생했는지의 여부입니다.

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"); 
} 

또는 당신은 부울 변수 소개 할 수