2011-01-12 10 views
17

従来のエラー処理は、すべての関数が成功/失敗に応じてコードを返すという方法に従う傾向があります。このコードをチェックして、エラーがあれば適切に処理します。エラーコードを返すのではなく、例外をスローする方が良いのはなぜですか?

ただし、現代のプログラミング言語は例外モデルに従っています。例外的にが発生した場合、例外がスローされ、処理されるまでバブリングを維持します。

私の質問はなぜ例外モデルに移動しましたか?この背後にある理由は何ですか?なぜそれは良いですか?

説明/リンクは大歓迎です。ここで

答えて

20

Exceptions vs. status returnsが、簡単に:

  1. 例外は、すべてのコールのステータスリターンをテストする際に必要なすべてのチェックのクリーンなコードを残し、
  2. 例外はあなたを聞かせて
  3. 例外は、ステータス戻り値よりも多くの情報を持ち運ぶことができます。
  4. 最も重要な点は、次の場合に例外を無視できないことです。ステータスを返すことができます。

最後に展開する:状態が返ってきたら何をするのか忘れると、エラーは無視されます。例外を使って何をすべきかを忘れた場合、例外はソフトウェアの外層に泡立ち、その部分が目に見えるようになります。

+1

例外を使用するとtry/catch(MyCustomException ex)が可能になり、/(他の開発者)が新しいタイプの例外を捕捉するtry/catchを追加できるようになりました。作成した。 –

+0

それは素晴らしい点です。私は、レイヤーが例外を無視して通過させるのが好きです。あなたのポイントは、個々の型の例外に対してきめ細かな処理ができることです(例外を型でキャッチすることをサポートする言語を使用していることを前提としています)。 –

9

は、例外を無視する理由の

  • のカップルです悪い返す値を無視して、正確に0アクションを必要とする開発者によるアクションが必要です。これは、理論的には、開発者がエラーを処理するか、それを無視するか、それが起こっていることを認識している可能性が高くなります。
  • エラーの箇所と処理の間をより明確に分離します。間にあるすべてのポイントでエラーを手動で伝播させることは強制しません。
  • 例外は、単純なエラーコードより大きい、より豊富な情報ペイロードです。エラーコードでこれを行う方法がありますが、それは後の考えであり、ちょっと面倒です。私は長さで、このことについて書いてきた
2

ステータスコードは、通常、関数の直後コーリングコードが処理できるように準備されているケースを表す場合に、例外より優れています。ステータスコードの問題は、直前の呼び出しコードがそれらを処理しない場合、おそらく何も起こりません。コードが例外をスローし、直ちに呼び出すコードがそれを処理する準備ができていない場合、その例外は少なくとも用意されていると主張するコードに伝播します。

関連する問題