1

私は次のコードを持っています:

try {
    /* etc. 1 */
} catch (SomeException e) {
    /* etc. 2 */
} catch (SomeException e) {
    /* etc. 3 */
} finally {
    /* 
     * do something which depends on whether any exception was caught,
     * but should only happen if any exception was caught.
     */

    /* 
     * do something which depends on whether an exception was caught and
     * which one it was, but it's essentially the same code for when no
     * exception was caught.
     */
}

ですから、キャッチした例外を保持したいと思います。すべてのcatchブロックの変数に割り当てる以外に、これを行う方法はありますか?

編集:明確にするために、tryブロックの外部でスコープが設定された変数を使用することを示唆する回答を投稿しないでください。私はそれができることを知っています、この質問の全体のポイントは代替案を見つけることです。

さて、私が本当に望んでいるのは、より柔軟なcatchブロックです。これにより、複数のcatchブロックが同じ例外をキャッチできます。たとえば、catch(Exception e)すでにキャッチされている場合でもすべてをキャッチし、例外catch(Exception e) except(NullPointerException, IllegalArgumentException)をスキップします。また、catchブロックはcatchingcontinue;、同じtryブロックの他のすべてのcatchブロックcatchingbreak;をスキップし、最後にさえスキップすることができます。

4

4 に答える 4

2

これを試して:

try {
    // your code throwing exceptions
} catch (Exception e) { // This catch any generic Exception
    // do whatever you want to do with generic exception
    ...
    if (e instanceof SomeException) {
        ...
    } else if (e instanceof OtherException) {
        ...
    }
}

Java 7を使用すると、これを行うこともできます:

try {
    // your code throwing exceptions
} catch (SomeException|OtherException e) { // This catch both SomeException and OtherException
    // do whatever you want to do with generic exception
    ...
    if (e instanceof SomeException) {
        ...
    } else if (e instanceof OtherException) {
        ...
    }
}
于 2013-03-20T13:25:23.853 に答える
1

variableブロックの外側に割り当てて、try-catchブロックで使用する必要がありfinallyます。

Exception caughtException = null;

try {
    /* etc. 1 */
} catch (SomeException e) {
    caughtException= e;
} catch (SomeOtherException e) {
    caughtException= e;
} finally {
    if (caughtException != null) {
        /* 
         * do something which depends on whether any exception was caught,
         * but should only happen if any exception was caught.
         */
    }
}

監査を行いたいようです。いくつかの注釈を使用して動作を処理してみませんか。AOPもちろん、前または後にそれらの例外をキャッチする適切な例外処理を使用してください。

于 2013-03-20T13:21:50.950 に答える
1

変数を catch ブロックのスコープ外に保持し、catch ブロックに割り当てます。

購入しないことを強くお勧めします。

最後にブロックは、例外に関係なく実行する必要があるリソースのクリーンアップまたは同様の機能に使用する必要があります。

すべての例外処理は、finally ブロックではなく、catch ブロックで行う必要があります。

于 2013-03-20T13:25:05.643 に答える
1

ここで私がお勧めするのは、例外処理の詳細を新しいメソッドに抽出し、instanceofチェックを回避するために必要なだけ具体的な catch ブロックからそれらのメソッドを呼び出すことです。instanceofこれには、 を使用せず、例外処理コードをcatchではなくブロックに保持しfinally、共有例外処理コードを特定の例外処理コードから明確に分離するという利点があります。はい、3 つのブロック間でいくつかの共有コードがありcatchますが、それは明確な 1 行のコードであり、私には受け入れられるように思えます。

try {
    // do work that uses resources and can generate any of several exceptions
} catch (SomeException1 e) {
    standardExceptionHandler(e);
    specificExceptionHandler1(e);
} catch (SomeException2 e) {
    standardExceptionHandler(e);
    specificExceptionHandler2(e);
} catch (Exception e) {
    standardExceptionHandler(e);
} finally {
    // this would include only code that is needed to cleanup resources, which is
    // what finally is supposed to do.
}
于 2013-03-20T16:04:58.003 に答える