</pre><pre name="code" class="php">
<?php
/*
* 2014年12月30日自己总结的关于php error 的知识和最佳实践
*
* 先从错误产生流程说起:
* php脚本运行--->脚本出错或主动报错---->触发php error 机制
* ---->机制判断:是否有自定义的错误处理机制?--->(是)使用自定义的机制---->(否)使用php内部的错误机制
*---->根据错误处理情况,决定脚本是退出还是继续运行
*
* 再说细节:
*
* ----主动报错----
*trigger_error(‘我的报错信息’,【错误级别】);
*脚本中,只要执行了这个函数,就会触发上面流程,比如:我传个参数,如果比3大,我就报错!
*if($var>3){
* trigger_error(‘数太大了,换一个’,E_USER_WARNING);
*}
*
* ----自定义错误机制------
* 我们可以单独写成一个自定义错误处理文件error_handler.php,然后每段脚本都加载它,这样我们就可以用自己的错误机制,而不用php内部的了!
* 如果这个文件写的好,对开发来说是非常有利的!
*
* 文件推荐写法:
* error_handler.php
*
* 先根据错误级别,给每个 级别写 上自定义处理函数
* function E_ERROR_handler($error_level,$error_message,【$error_file,$error_line,$error_context】){
* 函数里面写错误处理代码!
* 一般会写的东西:
* 错误发生的时间:$time=date("Y-m-d H:i:s");
* 错误级别(数值):$error_level;
* 传过来的错误信息:$error_message;
* 错误发生的文件名:$error_file;
* 错误发生的行数:$error_line;
* 错误发生时涉及到的变量数组:$error_context;
* 你可以根据$error_level,或者$error_message的值,来决定如何处理错误
* if($error_level==8){....}
* if($error_message=="数据库错误"){...}
* 这些东西,你可以选择,将它们打印在屏幕上,然后退出脚本/继续脚本
* echo .....;或者exit(....);
* 但是我建议你将它们都分门别类的记录下来;首先,将上面信息链接成字符串
* $error_log;
* 然后,再存到文件中去!
* error_log($error_log;3,'/var/php/error_log/E_ERROR_log.log');
* }
* function E_WARNING_handler(){....}
* function E_NOTICE_handler(){....}
* .....
* 再将每个自定义好的函数,根据错误处理级别,注册到php error 处理机制中去!
* set_error_handler('E_ERROR_handler',E_ERROR);
* set_error_handler('E_NOTICE_handler',E_NOTICE);
* .....
*
* ----题后话-----
* 错误处理的原理和形式是不难的,难点是你如何设计自定义错误处理的handler函数
* -----附录(错误级别)------
值 常量 描述
2 E_WARNING
非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE
Run-time 通知。脚本发现可能有错误发生,但也可能在脚本正常运行时发生。
256 E_USER_ERROR
致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512 E_USER_WARNING
非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024 E_USER_NOTICE
用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR
可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL
所有错误和警告,除级别 E_STRICT 以外。
(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)
*
* ----附录(php.ini关于error的设置)-----
* 开发环境:
* error_reporting=E_ALL
* display_errors=On
* html_errors=On
* log_errors=Off
* 上线运营的系统:
* error_reporting=E_ALL & ~E_NOTICE
* display_errors=Off
* html_errors=Off
* log_errors=On
* error_log="/var/log/httpd/my-php-error.log"
* ignore_repeated_errors=on
* ignore_repeate_source=on
*
*
*
*
*
*
*
*
* */