PHP 5 には、他の言語と同様の例外処理モジュールが追加されています。 PHP コードで生成された例外は、throw ステートメントによってスローされ、catch ステートメントによってキャッチされます。例外処理が必要なコードは、発生する可能性のある例外をキャッチするために try コード ブロックに配置する必要があります。各トライには、対応するキャッチが少なくとも 1 つ必要です。複数のキャッチを使用して、さまざまなクラスによって生成された例外をキャッチします。 try コード ブロックが例外をスローしなくなった場合、またはスローされた例外に一致する catch が見つからなかった場合、PHP コードは最後の catch にジャンプした後、実行を続行します。もちろん、PHP では、catch ブロック内で例外を再度スローすることができます。
例外がスローされると、後続のコード (翻訳者注: 例外がスローされたときのコード ブロックを指します) は実行を続行せず、PHP は最初に一致する catch を見つけようとします。例外がキャッチされず、対応する処理に set_Exception_handler() を使用する必要がない場合、PHP は重大なエラーを生成し、Uncaught Exception... (キャッチされない例外) プロンプト メッセージを出力します。
HP の内部関数は主にエラー報告を使用し、最新のオブジェクト指向拡張機能のみが例外を使用することに注意してください。ただし、エラーは ErrorException を通じて簡単に例外に変換できます。
PHP 標準ライブラリ (SPL) は、多くの組み込み例外クラスを提供します。
例 #1 は例外をスローします
<?php function inverse($x) { if (!$x) { throw new Exception('Division by zero.'); } else return 1/$x; } try { echo inverse(5) . "\n"; echo inverse(0) . "\n"; } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } // Continue execution echo 'Hello World'; ?>
上記のルーチンは出力します:
0.2
キャッチされた例外: ゼロによる除算。
Hello World
例 #2 ネストされた例外
<?php class MyException extends Exception { } class Test { public function testing() { try { try { throw new MyException('foo!'); } catch (MyException $e) { /* rethrow it */ throw $e; } } catch (Exception $e) { var_dump($e->getMessage()); } } } $foo = new Test; $foo->testing(); ?>
上記のルーチンは出力します:
string(4) 「ふー!」