php处理异常机制

与异常相关的配置项:

①:错误有两种呈现方式,一种是display_errors=on /off 配置项控制错误是否显示到浏览器中,另一种是log_errors和error_log配置的错误日志里面

②:配置error_reporting设置错误报告级别,这个与display_errors和error_log有关,只会把对应的错误级别记录到错误日志中或者打印到浏览器上

异常处理:

①:try...catch的方式进行异常的捕获,这其中是phper要主动抛出一个异常出来throw new exception();它会被第一个catch给捕获,这里有两点注意,display_errors要开启和错误是主动抛出的(throw);有个驳论就是既然要主动throw出来错误,那么就是能够判断处那边出问题,那么都知道会出错误为什么还要捕获呢?之间写出正确的逻辑不就好了

②:框架中是可以捕获所有的错误和异常的,主要用到register_shutdown_function,set_error_handler,set_exception_handler三个函数

        A: set_error_handler() 

这个函数用于捕获错误,设置一个用户自定义的错误处理函数,当程序出现错误的时候会自动调用此方法,不过需要注意一下两点,第一:如果存在此方法,相应的error_reporting()就不能在使用了。所有的错误都会交给自定义的函数处理。第二:此方法不能处理一下错误级别(对应php的错误级别,文章下面会给出介绍)E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING;set_error_handler()函数所在的文件中产生的E_STRICT,该函数只能捕获系统产生的一些warning、notice级别的错误。

例子:

 <?php
     set_error_handler('zyferror');
     function zyferror($type, $message, $file, $line)
     {
       var_dump('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />');
     }
 ?>

调用方法多样:

 <?php
     // 直接传函数名 NonClassFunction
      set_error_handler('function_name'); 
 
      // 传 class_name && function_name
      set_error_handler(array('class_name', 'function_name')); 
 ?>

            B:register_shutdown_function()

捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误,die(),exit,异常,正常结束都会调用;这个函数很吊,但它只提供了执行的时间,对于是否包含错误需要借助于另一个函数:error_get_last();这个函数可以拿到本次执行中产生的错误。

error_get_last();返回的信息:【type】错误类型   , 【message】错误信息 , 【file】错误发生的文件,【line】错误所在行

例如:

 <?php
     register_shutdown_function('zyfshutdownfunc');
     function zyfshutdownfunc()
     {
         if ($error = error_get_last()) {
             var_dump('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>');
         }
     }
 ?>

            C:set_exception_handler()

设置默认的异常处理程序,用在没有用try/catch块来捕获的异常,也就是说不管你抛出的异常有没有人捕获,如果没有 人捕获就会进入到该方法中,并且在回调函数调用后异常会中止。

例如:

 <?php
     set_exception_handler('zyfexception');
     function zyfexception($exception)
     {
         var_dump("<b>set_exception_handler: Exception: " . $exception->getMessage()  . '</b>');
     }
     throw new Exception("zyfexception");
 ?>


扩展:错误类型和屏蔽方案

三种错误分类:1、注意(notice) 2、警告(warnings)3、致命错误(fatal  errors)

错误种类:

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:捕获所有的错误和警告。

 

屏蔽PHP错误提示

方法一:在有可能出错的函数前加@,然后or die("") 如:

@mysql_connect(...) or die("Database Connect Error")

方法二:编辑php.ini ,查找"display_errors =" ,将“=”后面的值改为"off。

方法三:在php脚本前加error_reporting(0),屏蔽所有错误提示。

其中,error_reporting 配置错误信息回报的等级。

语法:int error_reporting(int [level]);


文章借鉴地址:https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html

猜你喜欢

转载自blog.csdn.net/mazhaer/article/details/80748471