Подтвердить что ты не робот

В блоке finally я могу узнать, было ли исключено исключение

Возможный дубликат:
Можно ли обнаружить, произошло ли исключение, прежде чем я ввел блок finally?

У меня есть метод рабочего процесса, который делает что-то, и выдает исключение, если произошла ошибка. Я хочу добавить показатели отчетности в свой рабочий процесс. В нижнем блоке finally, есть ли способ сказать, что один из методов в блоке try/catch сделал исключение?

Я мог бы добавить свой собственный код catch/throw, но предпочел бы более чистое решение, поскольку это шаблон, который я повторно использую в своем проекте.

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

Ответ 1

Нет автоматического способа предоставления Java. Вы можете использовать логический флаг:

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

Ответ 2

Два решения: дважды вызовите reportEndWorkflow, один раз в блоке catch и один раз в конце try:

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

Или вы можете ввести логическую переменную:

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

Ответ 3

Вы там, потому что ваш блок try завершил выполнение. Было ли исключено исключение.

Чтобы различать, когда происходит исключение или выполняется ли выполнение потока вашего метода успешно, вы можете попробовать сделать что-то вроде этого:

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