PHP 內置的異常處理類

<?php
class Exception
{
    protected $message = 'Unknown exception';   // 異常信息
    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();                       // 可輸出的字符串
}
?>

DEMO:


<?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('1 is an invalid parameter', 5);
                break;

            case self::THROW_DEFAULT:
                // 拋出默認的異常
                throw new Exception('2 isnt allowed as a parameter', 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";
?>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章