2012-05-24 8 views
33
geworfen wurde

Mögliche Duplizieren:
Is it possible to detect if an exception occurred before I entered a finally block?In einem finally-Block kann ich feststellen, ob eine Ausnahme

ich eine Workflow Methode, die Dinge tut, und wirft eine Ausnahme, wenn ein Ein Fehler ist aufgetreten. Ich möchte Berichtsmetriken zu meinem Workflow hinzufügen. Gibt es im Block finally eine Möglichkeit, festzustellen, ob eine der Methoden im try/catch-Block eine Ausnahme ausgelöst hat?

Ich könnte meinen eigenen Fang/Wurf-Code hinzufügen, würde aber eine sauberere Lösung bevorzugen, da dies ein Muster ist, das ich in meinem Projekt wiederverwende.

@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

Diese Frage könnte ein Duplikat der vorgeschlagenen sein, aber es ist sehr schwer zu sagen, weil die andere Frage ziemlich bewundernswert verworren ist. Die Fähigkeit, innerhalb eines Endblocks zu bestimmen, ob der Block innerhalb des normalen Ablaufs der Steuerung ausgeführt wird oder aufgrund einer ausgelösten Ausnahme, wäre immens nützlich, da dies die Transaktionsverarbeitung vereinfachen würde; Leider bieten weder Java noch C# derzeit diese Fähigkeit afaik. Schande. –

Antwort

47

Es gibt keinen automatischen Weg von Java. Sie können ein boolesches Flag verwenden:

3

Sie sind dort, weil Ihr try-Block die Ausführung abgeschlossen hat. Ob eine Ausnahme ausgelöst wurde oder nicht

Zur Unterscheidung zwischen, wenn eine Ausnahme auftritt oder ob Ihre Methode Flow Ausführung erfolgreich abgeschlossen, Sie versuchen, so etwas wie dies tun könnte:

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

Zwei Lösungen: reportEndWorkflow zweimal, einmal in einem catch Block aufrufen und einmal in das Ende der try:

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

Oder Sie können eine boolean Variable vorstellen:

boolean finished = false; 
try { 
    // ... 
    finished = true; 
} finally { 
    // ... 
} 
Verwandte Themen