2012-05-24 14 views
33

Powiel możliwe:
Is it possible to detect if an exception occurred before I entered a finally block?W końcu bloku, mogę stwierdzić, czy wyjątek został rzucony

Mam metodę przepływu pracy, który robi rzeczy, i zgłasza wyjątek, jeśli Wystąpił błąd. Chcę dodać dane raportowania do mojego przepływu pracy. W ostatnim bloku poniżej, czy istnieje sposób sprawdzenia, czy jedna z metod w bloku try/catch rzuciła wyjątek?

Mogę dodać własny kod catch/throw, ale wolałbym czystsze rozwiązanie, ponieważ jest to wzorzec, którego używam w całym projekcie.

@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

To pytanie może być duplikatem tego sugerowanego, ale jest to bardzo trudne do odróżnienia, ponieważ inne pytanie jest dość wspaniale zawiłe. Możliwość określenia w ramach bloku końcowego, czy blok jest wykonywany w ramach normalnego przepływu sterowania, czy z powodu wyrzuconego wyjątku, byłaby niezwykle przydatna, ponieważ uprościłaby przetwarzanie transakcji; Niestety, ani java ani C# obecnie nie oferują tej zdolności afaik. Wstyd. –

Odpowiedz

47

Nie ma automatycznego sposobu dostarczanego przez Javę. Możesz użyć flagi boolowskiej:

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

Jesteś tam, ponieważ Twój blok try zakończył wykonanie. Określa, czy wyjątek został odrzucony czy nie.

Aby rozróżnić kiedy występuje wyjątek lub czy wykonanie przepływu metoda zakończone powodzeniem, można spróbować zrobić coś takiego:

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

dwa rozwiązania: zadzwoń reportEndWorkflow dwa razy, raz na jakiś catch bloku i raz koniec try:

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

Albo można wprowadzić zmienną logiczną:

boolean finished = false; 
try { 
    // ... 
    finished = true; 
} finally { 
    // ... 
} 
Powiązane problemy