精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||
发表时间:2010-12-11
今天在写一个类时,要将PHP的默认错误处理函数接管,使用自定义的错误处理函数,在函数中,将错误封装成ErrorException后抛出,发现抛出的异常跟踪信息中,函数的参数错位了,下面是这个问题的示例代码:
<?php class ErrorHandle { function __construct() { set_error_handler(array($this, 'errorHandle')); } function errorHandle($error_no, $error_msg, $file, $line) { throw new ErrorException($error_msg, 0, $error_no, $file, $line); } function test($x) { $this->error(); } function error() { $a = $b; } } $err = new ErrorHandle(); $err->test('m'); 输出的结果为: <br /> <b>Fatal error</b>: Uncaught exception 'ErrorException' with message 'Undefined variable: b' in D:\website\localhost\index.php:18 Stack trace: #0 D:\website\localhost\index.php(18): ErrorHandle->errorHandle() #1 D:\website\localhost\index.php(15): ErrorHandle->error('m') #2 D:\website\localhost\index.php(24): ErrorHandle->test() #3 {main} thrown in <b>D:\website\localhost\index.php</b> on line <b>18</b><br /> 从上面的输出可以看出,参数'm'转递给了ErrorHandle->error();而不是实际上的ErrorHandle->test('m');即: $err->test('m'); 参数相当于移位了,不知道是什么原因.
但是当我安装了xdebug时,发现用它的异常输出中异常跟踪是正确的(xdebug会接管PHP内置的异常输出函数),如下:
我用的PHP版本是5.2.10,以为是PHP的BUG,但又不确定,所以没有去bugs.php.net上提交,如果发现过类似问题的童鞋们,希望可以讨论一下 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2010-12-11
这个问题已经解决,确实是PHP的Bug,但已经在新的版本中修复了.
<br /> <b>Fatal error</b>: Uncaught exception 'ErrorException' with message 'Undefined variable: b' in D:\website\localhost\index.php:18 Stack trace: #0 D:\website\localhost\index.php(18): ErrorHandle->errorHandle(8, 'Undefined varia...', 'D:\website\loca...', 18, Array) #1 D:\website\localhost\index.php(15): ErrorHandle->error() #2 D:\website\localhost\index.php(24): ErrorHandle->test('m') #3 {main} thrown in <b>D:\website\localhost\index.php</b> on line <b>18</b><br />
注意红色高亮的部分~~ 感觉PHP修复Bug还是比较快的 |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2010-12-11
throw new Exception要写在try...catch内
|
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2011-02-24
cevin 写道 throw new Exception要写在try...catch内 说明一点:Exception不一定要放在try块中. PHP中,没有被捕获的异常会被PHP内置的异常捕获函数捕获,并且,你也可以使用set_exception_handler来自定义默认异常捕获函数,这样一个好处就是当一个异常没有被捕获时,你可以自定义异常地显示方式,比如加点HTML,CSS让它更加漂亮,还可以将它记录到日志. |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
发表时间:2011-02-24
cevin 写道 throw new Exception要写在try...catch内
楼上说的对,不需要 |
|||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||
浏览 3282 次