PHP异常和错误

一、PHP的异常和错误

异常:在程序运行中不符合预期的情况及与正常流程不同的情况。一种不正常的情况,就是按照正常逻辑不该出错,但任然出错的情况,这属于逻辑和业务流程的一种中断,而不是语法错误。

错误:属于自身问题,是一种非法语法或环境问题导致,让编译器无法通过检查甚至无法运行的情况。(简单说就是使脚本运行不正常的情况)

二、错误的级别

大致分为几类:

1、deprecated,最低级别的错误,表示“不推荐、不建议”。一般是由于使用不推荐的、过时的函数或语法造成的。虽不会影响PHP正常流程,但一般情况下建议修正。

2、notice,一般告诉你语法中存在不当的地方。如使用的变量未定义、数组索引是字符时没有加引号,php视为常量去查找,找不到再视为变量。

不影响PHP正常流程

3、warning,比较高的错误,在语法中出现很不恰当的情况下才报此错误,比如函数参数不匹配。这种级别的会导致得不到预期结果,故需要修改代码。

4、fetal error,致命错误,直接导致PHP流程终结,后面的代码不再执行。比如调用一个不存在的方法,此错误必须处理。

扫描二维码关注公众号,回复: 5361918 查看本文章

5、prase error,最高级别的错误,语法解析错误。属于语法检查阶段错误,导致PHP无法通过语法检查。

PHP手册中一共定义了16个级别的错误,最常见的就这几个。

三、PHP中的错误处理机制

set_error_handler函数接管PHP错误处理,也可以使用trigger_error函数主动抛出一个错误。

set_error_handler(error_function, error_types)

设置用户自定义的错误处理函数。函数用于创建运行期间的用户自己的错误处理方法。它需要先创建一个错误处理函数,然后设置错误级别。

参数描述:

  error_function($errno, $errstr, $errfile, $errline):规定发生错误时运行的函数。必须。用户的函数需要接受两个参数:错误码和描述错误的 string。另外有可能提供三个可选参数:发生错误的文件名、发生错误的行号 以及发生错误的上下文(一个指向错误发生时活动符号表的 array。

  支持多种调用:

<?php
     // 直接传函数名 NonClassFunction
     set_error_handler('function_name'); 

     // 传 class_name && function_name
     set_error_handler(array('class_name', 'function_name')); 
?>

  error_type:规定在哪个错误报告级别会显示用户定义的错误。可选。默认是  E_ALL | E_STRICT。

注意:使用该函数,会完全绕过标准PHP错误处理函数(error_reporting(),包括@符),如果有必要,用户定义的错误处理程序必须终止(die())脚本。如果在脚本执行前发生错误,由于那时自定义程序还没有注册,因此不会用到这个自定义错误处理程序。所以一般定义在开头。且以下级别的错误不能由用户定义的函数来处理:E_ERROR、 E_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING, E_PARSE、和在调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。 只能捕获系统产生的一些Warning、Notice、Deprecated级别的错误。

可以在同一个页面使用restore_error_handler()函数取消自定义函数的接管。

register_shutdown_function(),此函数会在PHP程序终止或者die()时触发一个函数,给PHP一个短暂的回光返照。捕获PHP的错误:Fatal Error、Parse Error等

error_get_last();这个函数可以拿到本次执行产生的所有错误。error_get_last();返回数组的信息:
  [type]           - 错误类型
  [message] - 错误消息
  [file]              - 发生错误所在的文件
  [line]             - 发生错误所在的行

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

a.php内容:
<?php
    // 模拟Fatal error错误
    //test();

    // 模拟用户产生ERROR错误
    //trigger_error('zyf-error', E_USER_ERROR);

    // 模拟语法错误
    var_dump(23+-+);

    // 模拟Notice错误
    //echo $f;

    // 模拟Warning错误
    //echo '123';
    //ob_flush();
    //flush();
    //header("Content-type:text/html;charset=gb2312");


b.php内容:
<?php
    error_reporting(0);
    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>');
        }
    }

    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 />');
    }

    require 'a.php';

四、PHP7对异常机制的改进

大多数的错误会被当做Error异常抛出,但还是不够完善,只有部分错误实现了Throwable接口。

参考文档:https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html#undefined

猜你喜欢

转载自www.cnblogs.com/cshaptx4869/p/10454086.html