Php/docs/language.exceptions.extending

提供:Dev Guides
< Php
移動先:案内検索

例外を拡張する

組み込みの 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";?>