45

可能重复:
是否可以在我进入 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(); 
  }
}
4

3 回答 3

64

Java没有提供自动方式。您可以使用布尔标志:

boolean success = false;
try {
  reportStartWorkflow();
  doThis();
  doThat();
  workHarder();
  success = true;
} finally {
  if (!success) System.out.println("No success");
}
于 2012-05-24T11:05:49.200 回答
9

两种解决方案:调用reportEndWorkflow两次,一次在一个catch块中,一次在末尾try

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

或者你可以引入一个布尔变量:

boolean finished = false;
try {
    // ...
    finished = true;
} finally {
    // ...
}
于 2012-05-24T11:06:34.953 回答
1

您在那里是因为您的 try-block 已完成执行。是否抛出异常。

要区分何时发生异常或您的方法流执行是否成功完成,您可以尝试执行以下操作:

boolean isComplete = false;
try
{
  try
  {
    reportStartWorkflow();
    doThis();
    doThat();
    workHarder();
    isComplete = true;
  }
  catch (Exception e)
  {}
}
finally
{
  if (isComplete)
  {
    // TODO: Some routine
  }
}
于 2012-05-24T11:06:02.713 回答