php-自定义错误类

     今天在例行写php代码的时候,papapa 敲完,自我感觉良好,一运行,直接报错 。 what a fuck !  不可能! 肯定是我运行的姿势不对,对于用习惯了laravel框架的我,内心直接呐喊三连。 仔细看代码,确实有try, catch 捕获异常。 不信这个邪,搞点牛逼的代码再试试:

try {
    echo 1/0;
} catch (Exception $e) {
    echo $e->getMessage();
}

      一试,果然还是报错啊,内心5s内久久不能冷静下来,感觉自己一直以来学的是假的php.   一直以来对异常处理挺模糊的,而今天又是个阳光明媚樱花盛开适合学习的日子(广告一波:我武大樱花挺美的),立下了flag,学习之!

      说干就干,百度,这里就不得不说一篇文章,写的太特么好了,感谢作者,链接地址再谈PHP错误与异常处理,只是在人群中多看了一眼,就被吸引住了。综合的查了下 php错误有以下几种:

      E_ERROR:通常会显示出来,也会中断程序执行。
      E_WARNING:通常都会显示出来,但不会中断程序的执行。
      E_NOTICE:在脚本正常运行下发生的代码错误。
      E_PARSE:语法解析错误。

      E_CORE_ERROR:在PHP启动时发生的致命错误。
      E_CORE_WARNING:报告在PHP启动时发生的非致命性错误。
      E_COMPILE_ERROR:编译时发生的致命错误,指出脚本的错误。

      E_USER_ERROR:用户产生的错误信息。
      E_USER_WARNING:用户产生的警告信息。
      E_USER_NOTICE:用户引发的注意消息。

     E_STRICT:编码标准化警告,运行时发生的错误。
     E_RECOVERABLE_ERROR:接近致命的运行时错误,若未被捕获则视同E_ERROR。

     E_ALL:捕获所有的错误和警告。

     而try{} catch(){} 模块只能捕获有限的错误,一般情况下需要代码代码段抛出异常才能被捕获到,比如:

try {
    throw new Exception('同志,醒醒,报错了');
} catch (Exception $e) {
    echo $e->getMessage();
}

      一看到这,我内心5T的草你马飞过,我他么都知道有错误了还不直接改吗?还要抛出干嘛。 上面说到的那篇文章再谈PHP错误与异常处理 又解惑了,原来php内置了  set_error_handler(),register_shutdown_function(),set_exception_handler()三个能够捕获异常的神器,三个函数怎么实现的以后再探讨,反正很牛逼。简单介绍下三个函数:

     set_error_handler()  能处理E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,E_STRICT,该函数只能捕获系统产生的一些Warning、Notice级别的错误

     register_shutdown_function() :   捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用

     set_exception_handler() :       设置默认的异常处理程序,用在没有用try/catch块来捕获的异常

    再次感谢再谈PHP错误与异常处理 的作者! 好了,接下来就利用 这set_error_handler函数分别实现一个自定义异常类:MyErrorException,废话少说,直接上可运行的代码:

MyErrorException:

final class MyErrorException extends Exception {
    protected static $instance;
    protected $message;
    protected $file;
    protected $line;
    protected $type;
    
    public function __construct($message , $file , $line , $type ) {
        $this->message = $message;
        $this->file    = $file;
        $this->line    = $line;
        $this->type    = $type;
    }
    public function message() {
        return $this->message; 
    }
    public function file() {
        return $this->file; 
    }
    public function line() {
        return $this->line; 
    }
    public function type() {
        return $this->type; 
    }
    public static function setException($type , $message , $file ,$line) {
        if(empty(self::$instance))
        {
            self::$instance = new  self($message , $file , $line , $type);
            throw  self::$instance;
        } else {
            $instance          = self::$instance;
            $instance->message = $message;
            $instance->type    = $type;
            $instance->line    = $line;
            $instance->file    = $file;
            throw  $instance;
        }

    }
}
set_error_handler(array('MyErrorException','setException'));
try {
    echo 1/0; 
} catch (MyErrorException $e) {
    echo  $e->message() .  $e->line()  . $e->file() . $e->type();
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值