开启辅助访问
帐号登录 |立即注册

PHP的异常Exception捕获与处理

 
PHP异常处理(Exception)

异常(Exception)
处理用于在指定的错误发生时改变脚本的正常流程,是在 PHP5 中的增加的一个重要特性。异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。异常处理的加入使得在 PHP 程序中排查错误、捕获异常更加简单容易,也使得 PHP 程序在健壮性方面有很大改善和提高。异常处理在 PHP 中的具体体现就是,PHP 提供了一个名叫 Exception 的类完成对 PHP 程序异常的处理,这个类包含了一些处理异常的函数,这些函数可以捕获程序异常和错误。

PHP 中的异常处理类
PHP 中提供了内置的异常处理类——Exception,该类中常用的成员函数如下所示:
getMessage():返回异常的消息内容;
getCode():以数字形式返回异常代码;
getFile():返回发生异常的文件名;
getLine():返回发生错误的代码行号;
getTrace():返回 backtrace() 数组;
getTraceAsString():返回已格式化成字符串的、由函数 getTrace() 函数所产生的信息;
__toString():产生异常的字符串信息,它可以重载。注意,该函数最前部是两个下划线。

当一个异常被抛出时,其后的代码不会再继续执行,而 PHP 就会尝试继续查找下一个能与之匹配的 catch。如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,将会产生一个严重的错误,并且输出 UncaughtException...(未捕获异常)的提示信息。

【示例】使用 try catch 和 throw 捕获程序中的异常。
<?php
    try{
        $err = '抛出异常信息,并跳出 try 语句块';
        if(is_dir('./test')){
            echo '这里是一些可能会发生异常的代码';
        }else{
            throw new Exception($err, 12345);   // 抛出异常
        }
        echo '上面抛出异常的话,这行代码将不会执行,转而执行 catch 中的代码。<br>';
    }catch(Exception $e){
        echo '捕获异常:'.$e->getMessage().'<br>错误代码:'.$e->getCode().'<br>';
    }
    echo '继续执行 try catch 语句之外的代码';
?>
运行结果如下:
捕获异常:抛出异常信息,并跳出 try 语句块
错误代码:12345
继续执行 try catch 语句之外的代码

PHP 创建自己的异常类
在各种语言里,对异常和错误的定义不同。在 PHP 里遇到任何错误都会抛出一个错误,很少会主动抛出异常,不像 Java 语言那样会预先定义好各种异常类,当程序执行到异常处的代码时会主动抛出。

PHP 的异常处理机制并不完善,在 PHP 中想处理不可预料的异常是办不到的,必须事先定义一些异常,将各种可能出现的异常进行 if…else 判断,手动抛出异常,所以在 PHP 里经常会使用到我们自己创建的异常类。

下面定义两个异常类,都继承自 Exception 基类。
class emailException extends Exception{
    function __toString(){
        return "<b>email is null</b>file:".$this->getFile().',line:'. $this->getLine();
    }
}
class nameException extends Exception{
}
__toString() 方法是自动被调用的,是在直接输出对象引用时自动调用的,所以“__toString()”方法一定要有个返回值(return 语句).
在实际业务中可根据不同需求抛出不同异常,业务代码如下:
function reg($reg) {
    if (empty($reg['email'])) {
        throw new emailException("emaill is null", 1);
    }
    if(empty($reg['name'])) {
        throw new nameException("name is null", 2);
     }
}
在执行业务代码时,需要使用 if 语句判断异常会发生的地方,然后手动抛出异常,将不同的异常分发给不同的异常类处理,如下所示:
try{
    $reg = array('phone'=>'1888888888');
    reg($reg);
} catch(emailException $e) {
    echo $e;
} catch(nameException $e) {
    echo 'error msg:' .$e->getMessage().'error code:'.$e->getCode();
} finally {
    echo ' finally';
}
这段程序根据不同的情况捕获不同的异常,如果第一个 catch 捕获了异常,即使程序中仍然存在其他异常,也会跳过其他的 catch 代码块,但是不管程序中是否出现异常,最终 finally 中的语句都会执行

执行以上程序的结果为:   
email is null file:/Library/WebServer/Documents/book/try.php,line:39 finally
以上就是本文的全部内容,感谢大家支持JScript之家——编程学习者社区!






回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

友情链接
  • 艾Q网

    提供设计文章,教程和分享聚合信息与导航工具,最新音乐,动漫,游戏资讯的网站。