例外を拡張する
組み込みの Exception クラスを拡張することで、例外クラスをユーザーが 定義することが可能です。以下のメンバーおよびプロパティは、 組み込みの Exception クラスから派生した子クラスの中でアクセス可能です。
例1 例外クラスを構築する
<?phpclass Exception extends Throwable{ protected $message = 'Unknown exception'; // exception message private $string; // __toString cache protected $code = 0; // user defined exception code protected $file; // source filename of exception protected $line; // source line of exception private $trace; // backtrace private $previous; // previous exception if nested exception public function __construct($message = null, $code = 0, Exception $previous = null); final private function __clone(); // Inhibits cloning of exceptions. final public function getMessage(); // message of exception final public function getCode(); // code of exception final public function getFile(); // source filename final public function getLine(); // source line final public function getTrace(); // an array of the backtrace() final public function getPrevious(); // previous exception final public function getTraceAsString(); // formatted string of trace // Overrideable public function __toString(); // formatted string for display}?>
クラスが、組み込みの Exception クラスを拡張し、 コンストラクタを再定義した場合、 全ての利用可能なデータが正しく代入されることを保証するために parent::__construct() もコールすることが強く推奨されます。 __toString() メソッドは、 オブジェクトが文字列として表された際に独自の出力を行うために 上書きすることができます。
注意:
例外を複製することはできません。Exception を clone しようとすると 致命的な
E_ERROR
エラーが発生します。
例2 例外クラスの拡張
<?php/** * カスタム例外クラスを定義する */class MyException extends Exception{ // 例外を再定義し、メッセージをオプションではなくする public function __construct($message, $code = 0, Exception $previous = null) { // なんらかのコード // 全てを正しく確実に代入する parent::__construct($message, $code, $previous); } // オブジェクトの文字列表現を独自に定義する public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } public function customFunction() { echo "A Custom function for this type of exception\n"; }}/** * 例外をテストするためのクラスを作成 */class TestException{ public $var; const THROW_NONE = 0; const THROW_CUSTOM = 1; const THROW_DEFAULT = 2; function __construct($avalue = self::THROW_NONE) { switch ($avalue) { case self::THROW_CUSTOM: // カスタム例外を投げる throw new MyException('1 is an invalid parameter', 5); break; case self::THROW_DEFAULT: // デフォルト例外を投げる throw new Exception('2 is not allowed as a parameter', 6); break; default: // 例外なし。オブジェクトが生成される $this->var = $avalue; break; } }}// 例1try { $o = new TestException(TestException::THROW_CUSTOM);} catch (MyException $e) { // Will be caught echo "Caught my exception\n", $e; $e->customFunction();} catch (Exception $e) { // Skipped echo "Caught Default Exception\n", $e;}// 実行を継続するvar_dump($o); // Nullecho "\n\n";// 例2try { $o = new TestException(TestException::THROW_DEFAULT);} catch (MyException $e) { // この型にはマッチしない echo "Caught my exception\n", $e; $e->customFunction();} catch (Exception $e) { // キャッチされる echo "Caught Default Exception\n", $e;}// 実行を継続するvar_dump($o); // Nullecho "\n\n";// 例3try { $o = new TestException(TestException::THROW_CUSTOM);} catch (Exception $e) { // キャッチされる echo "Default Exception caught\n", $e;}// 実行を継続するvar_dump($o); // Nullecho "\n\n";// 例4try { $o = new TestException();} catch (Exception $e) { // スキップされる、例外なし echo "Default Exception caught\n", $e;}// 実行を継続するvar_dump($o); // TestExceptionecho "\n\n";?>