Em um bloco finalmente, posso dizer se uma exceção foi lançada

Duplicar Possível:
É possível detectar se uma exceção ocorreu antes de eu entrar no bloco finally?

Eu tenho um método de stream de trabalho que faz coisas e lança uma exceção se ocorreu um erro. Quero adicionar métricas de relatórios ao meu stream de trabalho. No bloco finally abaixo, existe alguma maneira de saber se um dos methods no bloco try / catch emitiu uma exceção?

Eu poderia adicionar meu próprio código de captura / lançamento, mas preferiria uma solução mais limpa, pois esse é um padrão que estou reutilizando em todo o meu projeto.

@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(); } } 

Não há nenhuma maneira automática fornecida pelo Java. Você poderia usar uma bandeira booleana:

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

Duas soluções: chame reportEndWorkflow duas vezes, uma vez em um bloco catch e uma vez no final da try :

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

Ou você pode introduzir uma variável booleana:

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

Você está lá porque o seu bloco de tentativas concluiu a execução. Se uma exceção foi lançada ou não.

Para distinguir entre quando uma exceção ocorre ou se a execução do stream do método foi concluída com êxito, você poderia tentar fazer algo assim:

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