2012-08-07 21 views
6

Hey StackOverflowコミュニティ、例外をスローしキャッチする

スロー例外について。一般的に、私はいつ例外をスローし、いつそれを捕まえるのですか?

「私は何らかの問題が発生したために終了しなければならない状況に遭遇し、回復できないとしましょう。私は捨てるのか、それとも捕まえるのか?

私は今、この権利を実行します。

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

これを行うには正しいことですか?私が例外を投げただけではもっと適切でしょうか?申し訳ありませんが、私は例外で初心者です:)

答えて

8

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

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

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

this introduction to exceptionsthis article which covers good and bad exception patternsとお読みください。

1

致命的な例外が発生した場合は例外をキャッチし、プログラムをうまく終了してください。キャッチせずにリトゥングするだけで、あなたのプログラムが殺されます。

0

キャッチ後、私はインシデントをログに記録してから、シャットダウンしてSystem.exitを呼び出すために必要な処理を行いますが、その例外を再度スローしません。

0

処理されていない例外のためにプログラムを終了させることは悪い習慣です。あなたは致命的と回復不能である例外をキャッチした場合は次のようにします。

  1. あなたは例外が何かあなたをでないことを知っている場合
  2. はプログラム
1

を終了任意のnecissaryクリーンアップを実行

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

  • +0

    私はそのメソッドの内部を処理できないという例外がある場合は、それをスローする必要があると言っています。しかし、同じ方法の中でそれを回復することができれば、それはメソッドの内部をキャッチするのが適切なときです。 また、例外を投げた基本的なメソッドを実装する(メソッド、テスト)をキャッチする例外を残す必要がありますか? –

    +0

    はい、あなたはあなたが何かをすることができるものだけを捕まえます。私は最後の部分を理解していない、あなたはそれを言い換えることができますか? –

    +0

    申し訳ありませんが、もう一度試してみましょう。私が実際に言いたいことは、単体テストやメインメソッドで例外をスローするメソッドを使用し、テストで例外をスローするとします。そこには何が起こりますか?それはちょうど終了ですか?エラーメッセージが表示されますか? この状況で最も適切なことは何ですか? –

    1


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

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

    関連する問題