首页 > 代码库 > PHP的异常处理

PHP的异常处理

PHP 的异常处理

    1、 什么是异常?

异常是指一个程序在运行过程出现的一个意外或者事件,中断了正常指令的执行,跳转到其他模块继续执行。

      PHP 5 提供了一种新的面向对象的错误处理方法。
        异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。

当异常被触发时,通常会发生:
            当前代码状态被保存
            代码执行被切换到预定义的异常处理器函数
            根据情况,处理器也许会从保存的代码状态重新开始执行代码,
            终止脚本执行,或从代码中另外的位置继续执行脚本
        我们将展示不同的错误处理方法:
            异常的基本使用
            创建自定义的异常处理器
            多个异常
            重新抛出异常
            设置顶层异常处理器    

2. 异常处理类
PHP具有很多异常处理类,其中Exception是所有异常处理的基类。
Exception::__clone — 异常克隆{}
final private void Exception::__clone ( void )   尝试克隆异常,这将导致一个致命错误。 


Exception具有几个基本属性与方法,其中包括了:

message 异常消息内容

 code 异常代码
 file 抛出异常的文件名
 line 抛出异常在该文件的行数
其中常用的方法有:
getTrace 获取异常追踪信息
 getTraceAsString 获取异常追踪信息的字符串
 getMessage 获取出错信息


在PHP代码中所产生的异常可被 throw 语句抛出并被 catch 语句捕获。需要进行异常处理的代码都必须放入到 try 代码块内,以便捕获可能存在的异常。每个try至少对应一个 catch 块。使用多个 catch 可以捕获不同的类所产生的异常。当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。当然,PHP 允许在 catch 代码块内再次抛出(throw)异常。

例如:

扩展(extend) PHP 内置的异常处理类

<?php
/**
 * 自定义一个异常处理类
 */
class MyException extends Exception
{
    // 重定义构造器使 message 变为必须被指定的属性
    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 = http://www.mamicode.com/self::THROW_NONE) {"Caught my exception\n", $e;
    $e->customFunction();
} catch (Exception $e) {        // 被忽略
    echo "Caught Default Exception\n", $e;
}

// Continue execution
var_dump($o); // Null
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); // Null
echo "\n\n";


// 例子 3
try {
    $o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) {        // 捕获异常
    echo "Default Exception caught\n", $e;
}

// 执行后续代码
var_dump($o); // Null
echo "\n\n";


// 例子 4
try {
    $o = new TestException();
} catch (Exception $e) {        // 没有异常,被忽略
    echo "Default Exception caught\n", $e;
}

// 执行后续代码
var_dump($o); // TestException
echo "\n\n";
?> 

  



 

PHP的异常处理