博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP错误及异常统一处理
阅读量:6825 次
发布时间:2019-06-26

本文共 2600 字,大约阅读时间需要 8 分钟。

hot3.png

php中错误及异常的统一收集并处理,主要就是用到3个内部方法:

1. register_shutdown_function(callable $callback [, mixed $parameter [, mixed $... ]) //php程序执行完成后执行的函数

它执行机制是:当页面所有PHP语句都执行完成时,再调用此 函数。注意,在这个时候它是从内存中调用,不是从PHP页面中调用,所以在此回调函数中不能使用相对路径。以下情况时会触发此函数执行:

1)当页面被用户强制停止时

2)当程序代码运行超时时

3)当PHP代码执行完成时,代码执行存在异常和错误、警告

在错误收集的使用上,需配合php另一个错误收集函数来实现:error_get_last(),代码如:

register_shutdown_function('ExceptionHandle::fatalError');//也可以对象方式调用$a = new ExceptionHandle();register_shutdown_function([$a,'fatalError']);class ExceptionHandle {// 致命错误捕获static public function fatalError() {    if($e = error_get_last()) {        switch($e['type']) {            case E_ERROR:            case E_PARSE:            case E_CORE_ERROR:            case E_COMPILE_ERROR:            case E_USER_ERROR:                ob_end_clean();                //此处添加业务逻辑,如记录log或展示错误页面等                break;        }    }}}

另外,需要注意:

1)它可以被多次调用,这些被注册的回调会按照他们注册时的顺序被依次调用

2)当程序由于 exit 、die和未处理的异常、错误结束时,不会触发该函数--此种情况,所以需要后面2个错误/异常函数来捕捉

3)PHP4后支持注册函数参数传递

2. set_error_handler(array(‘Debug’,'appError’)); //设置一个用户定义的错误处理函数

class ExceptionHandle {/** * 自定义错误处理 * @access public * @param int $errno 错误类型 * @param string $errstr 错误信息 * @param string $errfile 错误文件 * @param int $errline 错误行数 * @return void */static public function appError($errno, $errstr, $errfile, $errline) {    switch($errno) {        case E_ERROR:        case E_PARSE:        case E_CORE_ERROR:        case E_COMPILE_ERROR:        case E_USER_ERROR:            ob_end_clean();            $errorStr['errno']    = $errno;            $errorStr['message'] = $errstr;            $errorStr['file']    = $errfile;            $errorStr['line']    = $errline;            //添加实际错误处理逻辑            break;        default:            //其他非致命类型错误只记录log,防止对页面影响            break;    }}}

3. set_exception_handler(array(‘Debug’,'appException’)); //自定义异常处理。

class ExceptionHandle {/** * 自定义异常处理 * @access public * @param mixed $e 异常对象 */static public function appException($e) {    $error            = array();    $error['message'] = $e->getMessage();    $trace            = $e->getTrace();    if('E' == $trace[0]['function']) {        $error['file'] = $trace[0]['file'];        $error['line'] = $trace[0]['line'];    } else {        $error['file'] = $e->getFile();        $error['line'] = $e->getLine();    }    //处理换行    $error['trace'] = $e->getTraceAsString();    //添加实际异常处理逻辑}}

===========美美的分割线================

注意:set_error_handler()、set_exception_handler()2个注册的回调函数均不会多次调用,即如果注册多个,以最后一个为生效回调。

通过以上3个函数注册,就可以很好的在一个你想要的地方统一接收项目里所以的错误、异常等信息,并做相应的处理,比如写log或展示友好的错误页等

转载于:https://my.oschina.net/u/125977/blog/1489827

你可能感兴趣的文章
递归方法
查看>>
Sonar+maven+jenkins集成,Java代码走查
查看>>
浏览器渲染页过程描述
查看>>
js中点击返回顶部
查看>>
Gtest源码剖析:1.实现一个超级简单的测试框架xtest
查看>>
UEditor 是一套开源的在线HTML编辑器
查看>>
Linux 命令简介
查看>>
第三方模块的安装
查看>>
Terracotta中锁与性能的问题
查看>>
遇到Linux系统安装时窗口过大,按钮点不到,该怎么解决
查看>>
Xamarin开发Android笔记:TextView行间距设定
查看>>
js 判断输入是否为正整数
查看>>
「收藏」一些有趣的图
查看>>
spring boot项目开发中遇到问题,持续更新
查看>>
探索虚函数(二)
查看>>
大一秋季学期学习总结
查看>>
骄傲狮子座的感情世界(图
查看>>
李青云老人的长寿秘诀【转】
查看>>
Springboot Thymeleaf 发邮件 将html内容展示在邮件内容中
查看>>
json概述及python处理json等数据类型
查看>>