可能重复:
Is it possible to detect if an exception occurred before I entered a finally block?
我有一个工作流方法可以执行操作,并在发生错误时抛出异常。我想将报告指标添加到我的工作流程中。在下面的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();
}
}
答案 0 :(得分:56)
Java没有提供自动方式。你可以使用布尔标志:
boolean success = false;
try {
reportStartWorkflow();
doThis();
doThat();
workHarder();
success = true;
} finally {
if (!success) System.out.println("No success");
}
答案 1 :(得分:8)
两种解决方案:拨打reportEndWorkflow
两次,一次在catch
区块,一次在try
末尾:
try {
// ...
reportEndWorkflow("success");
} catch (MyException ex) {
reportEndWorkflow("failure");
}
或者你可以引入一个布尔变量:
boolean finished = false;
try {
// ...
finished = true;
} finally {
// ...
}
答案 2 :(得分:2)
你在那里因为你的try-block已经完成了执行。是否抛出异常。
要区分何时发生异常或方法流程执行是否成功完成,您可以尝试执行以下操作:
boolean isComplete = false;
try
{
try
{
reportStartWorkflow();
doThis();
doThat();
workHarder();
isComplete = true;
}
catch (Exception e)
{}
}
finally
{
if (isComplete)
{
// TODO: Some routine
}
}