例外がスローされなかった場合にのみコードが実行されるようにするにはどうすればよいですか?
最後に、例外があったかどうかに関係なくコードが実行されます。
try {
//do something
} catch (Exception e) {}
//do something only if nothing was thrown
次の2つの方法があります。
try {
somethingThatMayThrowAnException();
somethingElseAfterwards();
} catch (...) {
...
}
または、コードの2番目のブロックをtry
ブロックの外側にする場合:
boolean success = false;
try {
somethingThatMayThrowAnException();
success = true;
} catch (...) {
...
}
if (success) {
somethingElseAfterwards();
}
if
ステートメントをfinally
ブロックに入れることもできますが、それが望ましいかどうかを判断するのに十分な情報が質問にありません。
_try {
doSomething();
doSomething2();
} catch (Exception e) {
doSomething3();
}
_
この例では、doSomething2()
によって例外がスローされない場合にのみ、doSomething()
が実行されます。
doSomething()
によって例外がスローされた場合、doSomething2();
はスキップされ、実行はdoSomething3();
にジャンプします
また、doSomething3()
によってスローされた例外がある場合、doSomething2();
が実行されることに注意してください。
例外がスローされない場合、doSomething3();
は実行されません。
コードをtry
ブロックに入れるだけです。例外がスローされると、catch
ブロックにスキップします。例外がスローされない場合、コードは実行されます。
try {
someMethodThatMayThrowException();
codeThatShouldBeRunIfNoExceptionThrown();
} catch (Exception e) {...}
提案の強化
try {
somethingThatMayThrowAnException();
somethingElseAfterwards();
} catch (...) {
...
}
受け入れられた答えから。あなたがすべきことは:
void foo() {
try {
doStuff();
} catch (...) {
handleException();
}
}
上記は、「クリーンなコード思考」にさらされていない人にとってはやり過ぎのように感じます。
しかし、ここでのポイント:あなたはnot 1つのメソッド内に異なる抽象化を混在させたいと思っています。つまり、1つのtryブロックがなく、同じメソッド内でその後ろに続くコードが増えます。
各メソッドに単純なパスが含まれていることを確認してください-読み取りフローを複雑にするものは避けてください。 such種類のコードの書き込みと読み取りに慣れるとすぐに、コードを理解する時間が劇的に短くなることがわかります。
フロー制御の例外は、一種の悪い習慣です。主張する場合は、boolean
変数を使用します。
boolean thrown = false;
try {
//do something
} catch (Exception e) {
thrown = true;
}
//do something only if nothing was thrown
if (!thrown) {
// do stuff
}