例外処理は次のようにtryで囲われた部分の実行中にthrowされたExceptionクラスのインスタンスをcatchする処理のことを言います。
<?php function inverse($x) { if (!$x) { throw new Exception('ゼロによる除算。'); } return 1/$x; } try { echo inverse(5) . "\n"; // 0.2 echo inverse(0) . "\n"; // この引数を渡した関数実行時点で例外が投げられる } catch (Exception $e) { echo '捕捉した例外: ', $e->getMessage(), "\n"; // 捕捉した例外: ゼロによる除算。 } // 実行は継続される echo "Hello World\n"; // Hello World
PHP: 例外(exceptions) – Manual
私的にはexitとgotoの合いの子の印象です。どこかでキャッチされない限り、処理が止まります。どこかのキャッチされるところまで処理をぶった切って飛んでいきます。
例外処理はおおよそそれ以上、現在の処理が続行できない場合にthrowされます。ファイルが見つからないので後に続くファイル操作の処理ができないとわかり、例外を投げて処理を打ち切る、というのは典型的な例です。例の0割り算の様に例外には様々なパターンがあります。new Exception($message)とあるように、基底例外クラスにメッセージだけ載せるのも一つの手ですが、例外の種類を分けるとそれだけで意味を持ち、分かる人にはもっとわかりやすくなります。
例外の拡張でよくあるものにSPL(StandardPHPLibrary)を用いたものがあります。次のリンクから一覧が見られます。
PHP: 例外 – Manual
いくつもありますが特に重要なのは次の二つです。
PHP: LogicException – Manual
PHP: RuntimeException – Manual
LogicExceptionはロジック例外、要するにプログラマの実装で致命傷が起きていることを示します。ValueObjectの様なプログラマの実装を規定する処理において、プログラマがその規定から外れた時に投げたりするのが一例です(LogicExceptionの派生も全然あります。InvalidArgumentExceptionはLogicExceptionの継承でよく使える例外です)。これが投げられたときは素直にデバッグ、修正をしましょう。
RuntimeExceptionは実行時にのみ起こる例外です。運悪く通信が断絶した時などプログラム外のインフラでどうしようもなくなった時に投げるのが良いです。FileNotFoundExceptionなんかはRuntimeExceptionの典型です。