PHP错误处理机制

作者: 四月不见 | 来源:发表于2017-08-23 16:19 被阅读241次

    PHP错误简介

    错误

            PHP提供了错误处理和日志记录的功能. 这些函数允许你定义自己的错误处理规则,以及修改错误记录的方式. 这样,你就可以根据自己的需要,来更改和加强错误输出信息以满足实际需要.

            常见的错误类型有:语法错误、环境错误、逻辑错误。平时遇到的warning、notice都是错误,只是级别不同而已。

            常见的错误级别有:Deprecated(最低级别)、Notice(通知)、Warning(警告)、Fatal(致命)、Parser(语法解析),E_USER_相关错误。     查看PHP所有的错误级别:PHP错误预定义常量

            在 PHP 中,默认的错误处理很简单。一条错误消息会被发送到浏览器,这条消息带有文件名、行号以及描述错误的消息。

    下面将详细介绍几个常用的错误处理函数:

    错误处理函数

    1、error_reporting  设置PHP的报错级别

    1)通过修改PHP配置文件中的error_reporting选项值

        如,在php.ini设置如下:error_reporting = E_ALL

    2)通过error_reporting()函数设置

        如:

        error_reporting(0);  // 关闭所有PHP错误报告

        error_reporting(-1);  // 报告所有 PHP 错误

        error_reporting(E_ALL); //和error_reporting(-1)一样

    3)通过ini_set() 函数运行时设置

        ini_set('error_reporting',E_ALL); 

    2、display_errors 设置是否将错误信息

    该选项设置是否将错误信息作为输出的一部分显示到屏幕,或者对用户隐藏而不显示。

    1) ini_set('display_errors',1);

    2)在php.ini设置如下:display_errors = On

    说明:display_errors设置为On, 会将错误显示到浏览器上,不管是On还是Off都会记录到你错误日志里面,前提是配置了错误日志log_errors和error_log

    3、set_error_handler  设置一个用户定义的错误处理函数

    1)如:set_error_handler('my_error'); //my_error()为自定义的错误处理方法。

    2)如果把自定义的错误封装到了一个类上,则使用数组的方式调用:

    set_error_handler(array('MyErrorHander' , 'deal'));  //MyErrorHander为错误类,deal为处理方法。

    3)set_error_handler()参数介绍如下:

    set_error_handler()参数

    注: 

    1) 以下级别的错误不能由用户定义的函数来处理: 

     E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING,和在  调用set_error_handler()函数所在文件中产生的大多数E_STRICT

    2)如果错误发生在脚本执行之前(比如文件上传时),将不会  调用自定义的错误处理程序因为它尚未在那时注册。

    4、trigger_error()  产生一个用户级别的 error/warning/notice 信息

    bool trigger_error (string $error_msg [,int $error_type = E_USER_NOTICE] );

    error_msg: 该 error 的特定错误信息,长度限制在了1024个字符。超过1024长度的字符都会被截断。

    error_type: 该 error 所特定的错误类型。仅 E_USER 系列常量对其有效,默认是E_USER_NOTICE。

    5、error_log —发送错误信息到某个地方

    将错误记录到指定日志中的方法:

    1)在配制文件中:error_log = E:\phpStudy\MyError\test_error.txt

    2)运行时设置:ini_set('error_log' , 'E:\phpStudy\MyError\test_error.txt');

    3)使用error_log函数:error_log("You messed up!",3,"./error/my-errors.log");

    将错误记录到系统日志当中:

    运行时配置如:ini_set('error_log' , 'syslog'); 这个比较少用,具体查看方法这里不做多介绍,可以自行百度或google。

    将错误发送到指定邮箱:

    如:error_log('当前系统被人攻击啦,产生致命错误!!!' , 1 , '2737555@qq.com');  

    当然,能成功发送的前提是得做好你的邮箱相关配制。

    6、error_get_last()  获取最后发生的错误

    返回了一个关联数组,描述了最后错误的信息,以该错误的 "type"、    "message"、"file" 和 "line" 为数组的键。  如果该错误由 PHP 内置函数导致的,"message"会以该函数名开头。  如果还没有错误则返回NULL。

    注意:

    1)使用@符号可以抑制错误输出。

    2)PHP配制文件中与错误相关选项

    常用案例

    例1、自定义错误处理函数

    开始测试:

    divide(0,1);   报错如:My WARNING:[512] The denominator cannot be zero ! -- on line 30 in file E:\phpStudy\WWW\test\index.php

    divide(3,0);   报错如:My NOTICE:[1024] You numerator is zero, it just a notice . -- on line 34 in file E:\phpStudy\WWW\test\index.php   并继续输出计算结果:0

    divide(3,'d');  报错如:My ERROR:[256] denominator and numerator must be number !       Fatal error on line 27 in file E:\phpStudy\WWW\test\index.php, PHP 5.6.27 (WINNT)      Aborting...   到这里就中断会程序,下面还有程序也不会执行。

    divide(2);   在这里共报3个错误,如下:

    divideee(3,'d');   这里调用了PHP内部的错误处理:Fatal error: Call to undefined function divideee() in E:\phpStudy\WWW\test\index.php on line 42   

    说明——以下级别的错误不能由用户定义的函数来处理:      E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING,和在  调用set_error_handler()函数所在文件中产生的大多数E_STRICT

    ----------   < 例1 测试结束 >   -------------

    参考:

    官方手册:http://php.net/manual/zh/book.errorfunc.php

    个人博客:http://blog.csdn.net/hguisu/article/details/7464977

    相关文章

      网友评论

        本文标题:PHP错误处理机制

        本文链接:https://www.haomeiwen.com/subject/cqhcdxtx.html