PHP の組み込み例外処理クラスを拡張する

伊谢尔伦
リリース: 2016-11-23 09:13:46
オリジナル
1073 人が閲覧しました

ユーザーは、PHP の組み込み例外処理クラスをカスタム例外処理クラスで拡張できます。次のコードは、組み込み例外処理クラスのどのプロパティとメソッドがサブクラスでアクセス可能で継承可能であるかを示しています。翻訳者注: 次のコードは、組み込みの例外処理クラスの構造を説明するためだけのものであり、実際的な意味を持つ使用可能なコードではありません。

例 #1 組み込み例外処理クラス

<?php
    class Exception
    { 
        protected $message = &#39;Unknown exception&#39;; // 异常信息
        protected $code = 0; // 用户自定义异常代码
        protected $file; // 发生异常的文件名
        protected $line; // 发生异常的代码行号
        function __construct($message = null, $code = 0);
        final function getMessage(); // 返回异常信息
        final function getCode(); // 返回异常代码
        final function getFile(); // 返回发生异常的文件名
        final function getLine(); // 返回发生异常的代码行号
        final function getTrace(); // backtrace() 数组
        final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息
        /* 可重载的方法 */
        function __toString(); // 可输出的字符串
}
?>
ログイン後にコピー

カスタム クラスを使用して組み込み例外処理クラスを拡張し、コンストラクターを再定義する場合は、同時にparent::__construct() を呼び出すことをお勧めします。すべての変数に値が割り当てられているかどうかを確認します。オブジェクトが文字列を出力したい場合は、__toString() をオーバーロードして出力スタイルをカスタマイズできます。

例 #2 PHP の組み込み例外処理クラスの拡張

<?php
    /**
     * 自定义一个异常处理类
     */
    class MyException extends Exception
    {
        // 重定义构造器使 message 变为必须被指定的属性
        public function __construct($message, $code = 0) {
            // 自定义的代码
            // 确保所有变量都被正确赋值
            parent::__construct($message, $code);
        }
        // 自定义字符串输出的样式
        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(&#39;1 is an invalid parameter&#39;, 5);
                    break;
                case self::THROW_DEFAULT:
                    // 抛出默认的异常
                    throw new Exception(&#39;2 isnt allowed as a parameter&#39;, 6);
                    break;
                default:
                    // 没有异常的情况下,创建一个对象
                    $this->var = $avalue;
                    break;
            }
        }
    }
    // 例子 1
    try {
        $o = new TestException(TestException::THROW_CUSTOM);
    } catch (MyException $e) { // 捕获异常
        echo "Caught my exception\n", $e;
        $e->customFunction();
    } catch (Exception $e) { // 被忽略
        echo "Caught Default Exception\n", $e;
    }
    // 执行后续代码
    var_dump($o);
    echo "\n\n";
    // 例子 2
    try {
        $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);
    echo "\n\n";
    // 例子 3
    try {
        $o = new TestException(TestException::THROW_CUSTOM);
    } catch (Exception $e) { // 捕获异常
        echo "Default Exception caught\n", $e;
    }
    // 执行后续代码
    var_dump($o);
    echo "\n\n";
    // 例子 4
    try {
        $o = new TestException();
    } catch (Exception $e) { // 没有异常,被忽略
        echo "Default Exception caught\n", $e;
    }
    // 执行后续代码
    var_dump($o);
    echo "\n\n";
?>
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート