7

StackOverflow コミュニティの皆様

例外のスローについて。一般的に、いつ例外をスローし、いつキャッチしますか?

ある問題が発生したためにやめなければならず、そこから回復できないという状況に遭遇したとしましょう。投げますか、それともキャッチしますか?

私は今これを行います:

    try {
       // some code
    }
    catch (IOException e) {
       logger.info("Failed to do something, and cannot continue" + e.getMessage(), e);
       e.printStackTrace();
       throw e;
    }

これは正しいことですか?例外をスローした方が適切でしょうか? 申し訳ありませんが、私は例外の初心者です:)

4

6 に答える 6

10

通常、プログラムの実行を継続したい場合は、メソッドで例外をキャッチします。代わりに、そのメソッドを呼び出しているより高いレベルのメソッドで例外を処理する必要がある場合は、例外をスローします。たとえば、すべてのメソッド呼び出しをカプセル化する try..catch ブロック (さまざまな例外に対してさまざまな catch ブロックを使用する可能性が高い) を持つ Main メソッドにスローすることができ、そこで例外を処理できます (たとえば、プログラムを終了します)。

例外をスローすると、メソッドがすぐに終了することに注意してください。これは、コードの流れに影響します。メソッドの途中で例外が発生する可能性があり、その例外が発生した場合にその下のコードを実行できない場合は、セクション全体を try/catch ブロックでラップするか、例外をスローする必要があります。

一般的なアドバイス - printStackTrace() は良くありません。自分でより適切なエラー出力を作成できます (また、出力にスタック トレースを含めることもできます)。さらに良いことに、ロギングを使用します。

この例外の概要と、良い例外パターンと悪い例外パターンについて説明しているこの記事を読むことをお勧めします。

于 2012-08-07T20:25:05.773 に答える
1


何か関係がある場合は、例外をキャッチし ます。あなたの場合-ログに書き込み、ユーザーにメッセージを表示して、整然と終了します。例外が発生したときにそれについて他にできることがない場合は、例外をスロー
し ます。

Microsoftのエンタープライズライブラリ例外処理アプリケーションブロックを使用することをお勧めします。例外に対処するのに役立ちます。これは、フローを制御し、構成を変更できるようにする方法です。

于 2012-08-07T20:23:29.750 に答える
1

例外が処理できるものではないことがわかっている場合は、最初に例外をキャッチせずにそのままにしておきます。すべてをキャッチし、スタックトレースとともにファイルに記録する 1 つの例外ハンドラーを用意します。たとえば、プログラムがコマンド ラインから実行されている場合、メイン メソッドですべてをキャッチして、そこにログを記録できます。

于 2012-08-07T20:20:46.157 に答える
1

致命的な例外が発生した場合は、例外をキャッチして、プログラムを正常に終了します。キャッチせずに再スローすると、プログラムが強制終了されます。

于 2012-08-07T20:13:37.837 に答える
0

未処理の例外が原因でプログラムを終了させることはお勧めできません。致命的で回復不能な例外をキャッチした場合は、次のようにします。

  1. ログに記録する
  2. 必要なクリーンアップを実行します
  3. プログラムを終了します
于 2012-08-07T20:17:09.100 に答える
0

キャッチした後、インシデントをログに記録し、きちんとシャットダウンするために必要なことを行い、System.exit を呼び出しますが、その例外を再度スローすることはありません。

于 2012-08-07T20:14:54.607 に答える