phptext.net PHPText.Net
PHPText.Net > 文章 > 技术 > WEB开发

PHP 异常获取方法 set_error_handler() 捕获错误

2015/02/10 01:00
1228人阅读
来说说这个相对陌生的函数,说说关于PHP异常的捕获。

用了PHP N年啦。不过PHP5往后跟进的其实不多,主要是CLASS的加强,如果没有IDE很难做,而大多PHP编辑器还是纯文本最好了。在PHP5的时候引进了异常机制 try{}catch{} 这玩意。。。。很不想吐槽,不过不吐不行,PHP的异常基本是摆设,要自己判断异常抛出,不能自行捕获会直接抛出错误。不过,这个只是类上,其实PHP已经做好了这个的,就是我们要讲的 set_error_handler()。所有PHP抛出的异常都会经过这个函数,而它支持让你自定义。下面我们来看看参数。


语法:

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )


参数:

error_handler 处理错误的函数名称

error_types 处理的错误类型


说明:

本函数可以用你自己定义的方式来处理运行中的错误, 例如,在应用程序中严重错误发生时,或者在特定条件下触发了一个错误(使用 trigger_error()),你需要对数据/文件做清理回收。


重要的是要记住 error_types 里指定的错误类型都会绕过 PHP 标准错误处理程序, 除非回调函数返回了 FALSE。 error_reporting() 设置将不会起到作用而你的错误处理函数继续会被调用 —— 不过你仍然可以获取 error_reporting 的当前值,并做适当处理。 需要特别注意的是带 @ error-control operator 前缀的语句发生错误时,这个值会是 0。


同时注意,在需要时你有责任使用 die()。 如果错误处理程序返回了,脚本将会继续执行发生错误的后一行。


以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。


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


对于error_handler函数,定义如下:

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )

参数:

errno,包含了错误的级别,是一个 integer。

errstr,包含了错误的信息,是一个 string。

errfile,包含了发生错误的文件名,是一个 string。

errline,包含了错误发生的行号,是一个 integer。

errcontext,是一个指向错误发生时活动符号表的 array。 也就是说,errcontext 会包含错误触发处作用域内所有变量的数组。 用户的错误处理程序不应该修改错误上下文(context)。


如果函数返回 FALSE,标准错误处理处理程序将会继续调用。


下面我们来个例子看看,如下简单代码:

<?php

echo 0/'PHPText.Net';

相信你一眼就看出了错误,正常报错提示如下:

Warning: Division by zero in F:\www\Display\2015\project\zl_qjbm\index.php on line 3

一般遇到这类错误,对于经常玩的人来说,一眼就知道刚才写丢了或者写错了位置。所以可以很快排查,但是对于用户就不一样了,这类错误就很麻烦他们会说乱码。。。。虽然上线一般都是空白也是问题的。接下来看设置过头部处理后的。

<?php

function phptext_error_handler($error_no, $error_str, $error_file, $error_line, $error_content){

    echo '<h1>不好意思,程序出现了错误,请把下面内容报告给站长!</h1>';

    echo '错误级别:'.$error_no.'<br />';

    echo '错误提示:'.$error_str.'<br />';

    echo '错误文件:'.$error_file.'<br />';

    echo '错误行号:'.$error_line.'<br />';

    echo '错误数据:'.base64_encode( serialize($error_content) ).'<br />';

    exit();

}

set_error_handler('phptext_error_handler');

echo 0/'PHPText.Net';


经过这段程序后报错提示如下,友好多啦。


不好意思,程序出现了错误,请把下面内容报告给站长!

错误级别:2

错误提示:Division by zero

错误文件:F:\www\Display\2015\project\zl_qjbm\index.php

错误行号:12

错误数据:YToxNDp7czo3OiJHTE9CQUxTI......

不过这里还是有一个错误不能拦截,因为这个错误,属于代码错误。那就是

Parse error: syntax error, unexpected

就这么多了,这个还是非常有用的~尤其是做产品的时候。

同类推荐

百度地图WEB API报错:APP Referer校验失败百度地图WEB API报错:APP Referer校验失败
微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘微信支付 官方SDK报错 Fatal error: Uncaught exception ‘WxPayException‘ with message ‘curl出错,错误码:60‘
关于ios/iphone/ipad 网页不能自动播放视频、音频的解决方案 mediaPlaybackRequiresUserAction  和 解决iphone/ipad视频播放单独弹出问题webkit-playsinline/allowsInlineMediaPlayback关于ios/iphone/ipad 网页不能自动播放视频、音频的解决方案 mediaPlaybackRequiresUserAction 和 解决iphone/ipad视频播放单独弹出问题webkit-playsinline/allowsInlineMediaPlayback
web app iphone4 iphone5 iphone6 响应式布局 适配代码web app iphone4 iphone5 iphone6 响应式布局 适配代码
PHP 判断是蜘蛛(搜索引擎)来访PHP 判断是蜘蛛(搜索引擎)来访
PHP版 P2P借贷公式算法函数大全 平息/等额本金/等额本息/先息后本/混合型PHP版 P2P借贷公式算法函数大全 平息/等额本金/等额本息/先息后本/混合型
iPhone iPad HTML5网页不能自动播放AUDIO音频、VIDEO视频 原因iPhone iPad HTML5网页不能自动播放AUDIO音频、VIDEO视频 原因
jQuery获得页面元素(div、table等)页面中的相对位置(position)和绝对位置(offset)jQuery获得页面元素(div、table等)页面中的相对位置(position)和绝对位置(offset)
ECSHOP 订单状态、支付状态、配送状态 相关程序文件、变量、常量 整理说明ECSHOP 订单状态、支付状态、配送状态 相关程序文件、变量、常量 整理说明
Discuz 用户整合 免激活 同步登录 解决方法Discuz 用户整合 免激活 同步登录 解决方法