何かを行うワークフローメソッドがあり、エラーが発生した場合は例外をスローします。ワークフローにレポート指標を追加したい。以下のfinallyブロックでは、try/catchブロックのメソッドの1つが例外をスローしたかどうかを確認する方法はありますか?
独自の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();
}
}
Javaが自動的に提供する方法はありません。あなたはブールフラグを使うことができます:
boolean success = false;
try {
reportStartWorkflow();
doThis();
doThat();
workHarder();
success = true;
} finally {
if (!success) System.out.println("No success");
}
2つの解決策:reportEndWorkflow
を2回呼び出します。1回はcatch
ブロックで、もう1回はtry
の最後で呼び出します。
try {
// ...
reportEndWorkflow("success");
} catch (MyException ex) {
reportEndWorkflow("failure");
}
または、ブール変数を導入できます。
boolean finished = false;
try {
// ...
finished = true;
} finally {
// ...
}
Try-blockの実行が完了したので、そこにいます。例外がスローされたかどうか。
例外がいつ発生するか、またはメソッドフローの実行が正常に完了したかどうかを区別するには、次のようにしてみます。
boolean isComplete = false;
try
{
try
{
reportStartWorkflow();
doThis();
doThat();
workHarder();
isComplete = true;
}
catch (Exception e)
{}
}
finally
{
if (isComplete)
{
// TODO: Some routine
}
}