首页 文章

在finally块中,我可以判断是否抛出了异常[重复]

提问于
浏览
38

可能重复:在我输入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(); 
  }
}

3 回答

  • 56

    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 {
        // ...
    }
    
  • 8

    你在那里是因为你的try-block已经完成了执行 . 是否抛出异常 .

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

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

相关问题