web-dev-qa-db-fra.com

Dans un bloc enfin, puis-je savoir si une exception a été levée

Duplicata possible:
Est-il possible de détecter si une exception s'est produite avant que j'entre dans un bloc enfin?

J'ai une méthode de workflow qui fait des choses et lève une exception en cas d'erreur. Je souhaite ajouter des statistiques de rapport à mon flux de travail. Dans le bloc finalement ci-dessous, existe-t-il un moyen de savoir si l'une des méthodes du bloc try/catch a levé une exception?

Je pourrais ajouter mon propre code catch/throw, mais je préférerais une solution plus propre car c'est un modèle que je réutilise dans mon projet.

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

Il n'y a aucun moyen automatique fourni par Java. Vous pouvez utiliser un drapeau booléen:

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

Deux solutions: appelez reportEndWorkflow deux fois, une fois dans un bloc catch et une fois à la fin de try:

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

Ou vous pouvez introduire une variable booléenne:

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

Vous y êtes parce que votre bloc d'essai a terminé son exécution. Qu'une exception ait été levée ou non.

Pour faire la distinction entre le moment où une exception se produit ou si l'exécution de votre flux de méthode s'est terminée avec succès, vous pouvez essayer de faire quelque chose comme ceci:

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