45

重複の可能性:
finally ブロックに入る前に例外が発生したかどうかを検出することは可能ですか?

エラーが発生した場合に例外をスローするワークフロー メソッドがあります。レポート指標をワークフローに追加したいと考えています。以下の finally ブロックで、try/catch ブロックのメソッドの 1 つが例外をスローしたかどうかを確認する方法はありますか?

独自のキャッチ/スロー コードを追加することもできますが、これはプロジェクト全体で再利用しているパターンであるため、よりクリーンなソリューションを好むでしょう。

@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

2 つの解決策:ブロック内で 1 回、 の最後で 1reportEndWorkflow回、2 回呼び出します。catchtry

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 に答える