1

Exception是所有异常的基类。

Exception {
    /* 属性 */
    protected string $message ;
    protected int $code ;
    protected string $file ;
    protected int $line ;
    
    /* 方法 */
    public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )
    final public string getMessage ( void )
    final public Exception getPrevious ( void )
    final public int getCode ( void )
    final public string getFile ( void )
    final public int getLine ( void )
    final public array getTrace ( void )
    final public string getTraceAsString ( void )
    public string __toString ( void )
    final private void __clone ( void )
}
Exception::__construct — 异常构造函数
Exception::getMessage — 获取异常消息内容
Exception::getPrevious — 返回异常链中的前一个异常
Exception::getCode — 获取异常代码
Exception::getFile — 获取发生异常的程序文件名称
Exception::getLine — 获取发生异常的代码在文件中的行号
Exception::getTrace — 获取异常追踪信息
Exception::getTraceAsString — 获取字符串类型的异常追踪信息
Exception::__toString — 将异常对象转换为字符串
Exception::__clone — 异常克隆

以上部分来自官网:http://php.net/manual/zh/clas...

下面是参考《PHP5权威编程》
try,catch,throw
异常处理使用3中语言结构:try,catch,throw。为了处理一个异常,需要在try代码块中运行一些代码

try{
    $article->display();
}

try代码只是PHP留意在代码块里的代码运行时产生的异常。如果出现了异常,它马上被传递给紧跟着try代码块的一个或者更多的获取代码块中:

catch(Exception $e){
    die($e->getMessage());
}

变量$e似乎包含了一个对象。它包含的异常的确是对象,唯一条件就是必须从Exception类继承。
如果想在你自己的代码中产生一个异常,使用throw语句:

$fp = @fopen($fileName,'r');
if(!is_resource($fp)){
    throw new FileException('could not open');
}

可以看出异常是个对象,throw只是简单的使用这个特定的对象作为异常的一部分
可以定义异常:

class IOException extends Exception{}
class FileException extends Exception{}

异常类中不需要成员变量或者方法:你需要的所有内容都已经在内置Exception类中定义了。

PHP在catch语句中使用所谓的“是一”关系对类的名字和异常对象做检查。也就是,如果该异常对象是一个catch类的实例,或者其子类的实例,PHP就执行catch代码
如:

try{
    $article->display();
}catch(IOException $e){
    print 'IOException';
}catch(FileException $e){
    print 'FileException';
}

这个例子中IOException的catch同时捕获到IOException和FileException,因为FileException是从IOException继承的

如果每一个catch都没能捕获到异常,那么会将该异常传递给调用的函数,给调用的函数提供机会来捕获。
如果异常在任何地方都没能捕获,那么PHP会提供最后的机会:异常处理函数。默认情况下PHP打印出错误信息、类的名字和一个堆栈信息。
通过调用set_exception_handler(),可以注册异常处理函数

function my_exception(Exception $e){
    print 'error is '.$e->getMessage();
    exit;
}

set_exception_handler('my_exception');

这个函数用来处理所有没能在catch中获取的异常,异常处理函数中不能再抛出异常。

看看ThinkPHP中的做法:

set_exception_handler(array('Think','appException'));

static public function appException($e) {
    halt($e->__toString());
}

static public function halt($error) {
        $e = array();
        if (APP_DEBUG || IS_CLI) {
            //调试模式下输出错误信息
            if (!is_array($error)) {
                $trace          = debug_backtrace();
                $e['message']   = $error;
                $e['file']      = $trace[0]['file'];
                $e['line']      = $trace[0]['line'];
                ob_start();
                debug_print_backtrace();
                $e['trace']     = ob_get_clean();
            } else {
                $e              = $error;
            }
            if(IS_CLI){
                exit(iconv('UTF-8','gbk',$e['message']).PHP_EOL.'FILE: '.$e['file'].'('.$e['line'].')'.PHP_EOL.$e['trace']);
            }
        } else {
            //否则定向到错误页面
            $error_page         = C('ERROR_PAGE');
            if (!empty($error_page)) {
                redirect($error_page);
            } else {
                $message        = is_array($error) ? $error['message'] : $error;
                $e['message']   = C('SHOW_ERROR_MSG')? $message : C('ERROR_MESSAGE');
            }
        }
        // 包含异常页面模板
        $exceptionFile =  C('TMPL_EXCEPTION_FILE',null,THINK_PATH.'Tpl/think_exception.tpl');
        include $exceptionFile;
        exit;
    }

在框架的入口注册异常处理函数:先引入对应的模板文件,然后在模板文件中直接显示出错误信息


hizengzeng
177 声望10 粉丝

hizengzeng