2012-05-24 15 views
33

Duplicar posibles:
Is it possible to detect if an exception occurred before I entered a finally block?En un bloque finally, puedo saber si una excepción ha sido lanzada

Tengo un método de flujo de trabajo que hace las cosas, y produce una excepción si un Se produjo un error. Deseo agregar métricas de informes a mi flujo de trabajo. En el bloque finally de abajo, ¿hay alguna forma de saber si uno de los métodos en el bloque try/catch arrojó una excepción?

Podría agregar mi propio código catch/throw, pero preferiría una solución más limpia ya que este es un patrón que estoy reutilizando en mi proyecto.

@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

Esta pregunta puede ser un duplicado de la sugerida, pero es muy difícil de decir, porque la otra pregunta es bastante admirable. La capacidad de determinar dentro de un bloque final si el bloque se está ejecutando dentro del flujo de control normal o debido a una excepción que se ha lanzado sería inmensamente útil porque simplificaría el procesamiento de las transacciones; por desgracia, ni Java ni C# ofrecen actualmente esta habilidad afaik. Vergüenza. –

Respuesta

47

Java no proporciona la forma automática. Puede usar un indicador booleano:

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

Usted está allí porque su try-block ha completado la ejecución. Si se lanzó una excepción o no.

distinguir entre cuando se produce una excepción o si su ejecución flujo de método que ha completado con éxito, podría intentar hacer algo como esto:

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

dos soluciones: llamar reportEndWorkflow dos veces, una vez en un bloque catch y una vez en al final de try:

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

O se puede introducir una variable booleana:

boolean finished = false; 
try { 
    // ... 
    finished = true; 
} finally { 
    // ... 
} 
Cuestiones relacionadas