В блоке 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();
}
}
Ответы
Ответ 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
}
}