0

うまくいけば、これを明確に説明できます。さまざまな例外を生成する可能性のある多くのステップを含むメイン メソッドがある場合、致命的なものもそうでないものもある場合、「回復可能な」ものを個別にキャッチする必要がありますか? 次のように、多くの try/catch ブロックが発生する可能性があるようです。

public static void main (String[] args) {
    try {
        //...
        for (int i=0;someArray.length;i++) {
            try{
                System.out.println("I = " + i);
                doSometing(i);
            } catch (RecoverableException e) {
                //recover, continue, whatever
                //log warning
                                    //keep 
            }
        }//end for loop

        try {
            doSomethingElse();
        } catch (AnotherRecoverableException e) {
            //not fatal, keep on chugging
        }

        //...

        //do more stuff that can throw unrecoverable exceptions
    } catch (UnrecoverableException e) {
        System.out.println("I can't handle this, it's too much!");
        e.printStackTrace();
    }
}

これを行うより良い方法はありますか?

4

4 に答える 4

3

私のパターンは、例外がプログラミングのバグを表す場合に例外を伝播させ、それらを処理できる場合は「問題」にできるだけ近づけて処理することです。

問題は、多くの潜在的なプログラミング バグがチェック例外をスローすることです。

そう:

  • すぐに対処できるチェック済みおよびチェックされていない例外を処理します。
  • チェックされた例外を処理する方法がわからない場合は、チェックされていない例外として再スローします。
  • メインやスレッドのような「トップレベル」のループは、「Exception」の try/catch/log で囲んで、バブルアップした例外がスレッドを強制終了しないようにする必要があります (ただし、未知のものを表すため、大声でログに記録します)。プログラミングのバグ!)
  • 例外に関係なく続行する必要があるクリティカル ループは、ループ コンストラクト内に "Exception" の try/catch/log を含めて、続行する必要があります。
  • この高レベルではスローできない例外をキャッチします。スロー可能には、おそらくキャッチしたくない回復不能な例外が含まれます。
  • 本当に例外をスローする必要がある場合は、呼び出し元にキャッチしてもらいたい (これを避けるようにしてください。これは、例外をコード フローとして使用していることを意味します!)、チェックされていない例外をスローしますが、それを文書化し、メソッドにチェックされていない例外を「スロー」させます。例外 (処理する必要はありませんが、これは追加のドキュメント/ヒントとして機能します)。

    チェック例外が嫌いな理由の背景として、次のようなコードが発生します。

    試す {
       Thread.sleep(1000);
    } catch(InterruptedException e) {}
    

    これにより、プログラムフローに関連するバグを見つけるのが非常に面倒なことを隠すことができます。この場合、単にスレッド制御の問題がある可能性があることを意味しますが、他の場合は、コードフローが「魔法のように」メソッドの途中で何の兆候もなく消えることを意味する可能性があります (より高いレベルの try/catch によって例外が検出されたため) )。

  • 于 2013-09-05T17:37:09.910 に答える
    0

    使えます。defaultUncaughtExceptionHandlerですが、スレッドにuncaughtExceptionHandlerが設定されていない場合にのみトリガーされます。

    于 2013-09-05T17:14:37.370 に答える