0

通常、接続を開いている場合は、try-catch-finally を実行します。

try {
    doSomething();
} catch(Exception e) {
    // handle the exception
} finally {
    close();
}

私のシナリオでは、2 つのキャッチと 2 つの異なるクロージングがあります。通常の場合は close() で、StrangeException がスローされた場合は closeStrange() です。

私はこのようなものを思いついた:

try {
    doSomething();
} catch(StrangeException e) {
    closeStrange();
    throw new MyExc(e);
} catch(Exception e) {
    close();
    throw new MyExc(e);
}
close();

この状況をこのように処理すれば安全かどうかを知りたいです。

編集:

おそらく明確ではありませんでした。クロージングの 1 つだけを呼び出したいのです。closeStrange() StrangeException がスローされた場合、close() 別の例外がスローされた場合、または何もスローされなかった場合。

4

4 に答える 4

5

いいえ、あなたが現在これを処理している方法は安全ではありません:

  • ブロックを使用していないfinallyため、スローされた非例外は、接続を閉じずに終了します
  • あなたは例外を「処理」していますが、これはほぼ確実に適切ではありません

あなたはおそらく欲しい:

boolean closedStrangely = false;
try {
   ...
} catch (StrangeException e) {
    closeStrangely();
    closedStrangely = true;
    throw e; // Or maybe not, or maybe throwing some custom exception
} finally {
    if (!closedStrangely) {
        close();
    }
}

closeStrangely()例外がスローされた場合、これは「通常どおり」閉じようとすることに注意してください。その動作を望まない場合は、 を呼び出すclosedStrangelyに true に設定してください。closeStrangely

編集:場合によってはカスタム例外をスローしたい場合でも、ほぼ確実にキャッチすべきではありませんException

于 2012-08-21T13:01:13.887 に答える
1

より一般的なパターンかもしれません。

try {
    doSomething();
} catch(StrangeException e) {
    // handle strange exception without closing.
} catch(Exception e) {
    // handle the exception without closing.
} finally {
    close();
}
于 2012-08-21T13:01:15.347 に答える
0
try {
    doSomething();
} catch(Exception e) {
    if(e instanceof StrangeException) {
        closeStrange();
    } else {
        close();
    }
} finally {
   close();
}

instanceof を使用して例外を確認できます

于 2012-08-21T13:00:31.323 に答える
0

どうですか:

try {
    doSomething();
    close();
} catch(StrangeException e) {
    closeStrange();
    throw;
} catch(Throwable e) {
    close();
    throw;
}

closeこのようにして、いずれかのいずれかを1つだけ呼び出しcloseStrange、例外を「通過」させます。

于 2012-08-21T13:00:49.543 に答える