资讯专栏INFORMATION COLUMN

PHP基础:异常处理Exception

laoLiueizo / 2836人阅读

摘要:是所有异常的基类。它包含的异常的确是对象,唯一条件就是必须从类继承。在语句中使用所谓的是一关系对类的名字和异常对象做检查。如果异常在任何地方都没能捕获,那么会提供最后的机会异常处理函数。

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;
    }

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22493.html

相关文章

  • PHP 扩展开发】Zephir 基础

    摘要:变量作为函数返回值时,必须声明为动态类型。动态变量与中的变量基本完全相同支持在使用时改变类型。比较运算符在运算时考虑变量类型,如果是动态变量与一致。与不一致,语句可以没有,表示忽略所有异常。 上一篇 《Zephir 简介》 简单介绍了环境搭建,编写了一个的简单示例。这一篇继续介绍 Zephir 基础。 基本语法Zephir 中,每个文件都必须有且只有一个类,每个类都必须有一个命名空间,...

    wawor4827 评论0 收藏0
  • php异常处理的深入

    摘要:当项目抛出异常时操作那个方法时传的参数执行操作异常相关操作当前异常类通过异常类名,我们可以知道是订单支付异常。 引出 如果你调一个类,调用时数据验证时报了个错,你会以什么方式返回 数组,布尔值? 数组这个可以带错误原因回来,那布尔值呢? 返回了个 false, 报错时把错误放在类变量里?还是专门用一个获取错误的方法进行获取? 上面说的情况是代码完全没有问题的情况。那如果是一些第三方的工...

    shadowbook 评论0 收藏0
  • thinkphp源码分析(四)—错误及异常处理

    摘要:源码分析错误及异常处理机制错误及异常处理机制文件是,在框架引导文件的的基础文件中注册不知道的可以去看源码分析二入口篇,通过进行的注册。异常中止处理将错误信息托管至写入日志通过获取最后抛出的错误,把信息托管至,在通过异常处理函数进行记录信息。 源码分析 错误及异常处理机制 错误及异常处理机制文件是/thinkphp/library/think/Error.php,在框架引导文件的的基础文...

    xialong 评论0 收藏0
  • 如何优雅的设计PHP异常

    摘要:现在我就用框架来进行实战下在实际业务中是如何优雅的使用异常的场景描述选择一个比较简单的业务场景,以登录模块为例,用户在移动端进行登录时,需要进行登录,注册,忘记密码,获取手机验证码等接口。 前言 刚开始接触PHP的时候没有意识到异常的重要性,有时候出问题很难精确的找到问题点,正确的处理异常也是一门学问 异常的类别 PHP7异常做了很多变动,异常类 Exception 和错误类 Erro...

    wing324 评论0 收藏0
  • 带你抛出优雅的处理系统异常

    摘要:关于抛出异常如在我的上一篇文中所说的一样在接口的设计中接口的返回的数据是非常重要的例如无法避免的等等这些都是要命的错误同时还有一个极大的问题就是在新增模块中例如我最近需要新增一个的分词查询模块这个在添加索引删除索引等等操作的时候是非常容易导 showImg(http://pqykjwm6s.bkt.clouddn.com/Grassland_Scenery_by_Shi_Yuejun....

    susheng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<