フェイルファストという考え方があります。これは異常状態になったらすぐに処理を停止してすぐに通知すべきという考え方です。これは”異常状態ならば処理は失敗するはず”という前提に成り立っており、これを実現した場合、失敗の原因となった場所=処理停止場所となりわかりやすい、という利点があります。言語でレベルでこの考え方が色濃く表れるのがnull参照の問題です。大体は、nullを参照するのは異常事態なのでその時点でエラーを吐く、nullを参照してもとにかく処理が致命的に落ちるまで続行する、の二択です。言語のオプションでこれを制御できるときもあります。例えばPHPでは表示するエラーのレベルを制御できます。
PHP: error_reporting – Manual
PHP: 定義済み定数 – Manual
時として言語レベルでは判断できない異常事態があります。例えば、在庫以上の個数の商品を注文したり、権限のないデータにアクセスしたり、想定しない状態遷移を行おうとしたり。そういった時には例外を投げるようにして異常が起きたことを通知するといいです。後にデータベースを見て整合性が合わないことに気づく様なことが起きるとてんやわんやです。
大規模な処理になるほど、プログラムの参加者が多いほど、再利用コードが多いほど、バグが生まれやすくなります。想定外の入出力は典型例です。そんな時に独自例外を投げる様にしますが、例外の捕捉で握りつぶされてしまうこともあります。そういったことを少なくするために例外の使い分けができます。例えば、PHPのSPL(Standard PHP Library)では次の様に例外クラスが用意されています。
SPL 例外クラスツリー ¶
プログラムのロジックいうなればコードリーディングの時点でわかる異常事態(例.値の型間違い)のための例外であるLogicExceptionクラスと実行時にのみ発生する異常事態(例.オーバーフローなど変数に入った値次第で起きる異常)の例外であるRuntimeException に大別されています。このうちLogicException系統は捕捉しないことが推奨されています。うまいこと使い分ければ多彩な表現ができ望んだ処理を作れます。