`
yibn
  • 浏览: 1469 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
文章分类
社区版块
存档分类

疑为PHP BUG:将PHP的错误封装为ErrorException出现的问题

阅读更多

今天在写一个类时,要将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-&gt;errorHandle()
#1 D:\website\localhost\index.php(15): ErrorHandle-&gt;error('m')
#2 D:\website\localhost\index.php(24): ErrorHandle-&gt;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内置的异常输出函数),如下:


( ! ) Fatal error: Uncaught exception 'ErrorException' with message 'Undefined variable: b' in D:\website\localhost\index.php on line 18( ! ) ErrorException: Undefined variable: b in D:\website\localhost\index.php on line 18 Call Stack # Time Memory Function Location
1 0.0499 66464 {main}( ) ..\index.php:0
2 0.0504 67224 ErrorHandle->test( string(1) ) ..\index.php:24
3 0.0505 67432 ErrorHandle->error( ) ..\index.php:15
4 0.0505 67984 ErrorHandle->errorHandle( long, string(21), string(30), long, array(0) ) ..\index.php:0

 

我用的PHP版本是5.2.10,以为是PHP的BUG,但又不确定,所以没有去bugs.php.net上提交,如果发现过类似问题的童鞋们,希望可以讨论一下

分享到:
评论
4 楼 xieye 2011-02-24  
cevin 写道
throw new Exception要写在try...catch内


楼上说的对,不需要
3 楼 yibn 2011-02-24  
cevin 写道
throw new Exception要写在try...catch内

说明一点:Exception不一定要放在try块中.

PHP中,没有被捕获的异常会被PHP内置的异常捕获函数捕获,并且,你也可以使用set_exception_handler来自定义默认异常捕获函数,这样一个好处就是当一个异常没有被捕获时,你可以自定义异常地显示方式,比如加点HTML,CSS让它更加漂亮,还可以将它记录到日志.
2 楼 cevin 2010-12-11  
throw new Exception要写在try...catch内
1 楼 yibn 2010-12-11  
<p>这个问题已经解决,确实是PHP的Bug,但已经在新的版本中修复了.<br><br>我安装了最新的PHP的5.3.4版本进行测试,发现现在的参数已经正确:</p>
<p> </p>
<pre>&lt;br /&gt;
&lt;<span class="start-tag">b</span>&gt;Fatal error&lt;/<span class="end-tag">b</span>&gt;:  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-&amp;<span class="entity">gt;</span>errorHandle(8, 'Undefined varia...', 'D:\website\loca...', 18, Array)
<span style="color: #ff0000;">#1 D:\website\localhost\index.php(15): ErrorHandle-&amp;<span class="entity">gt;</span>error()
#2 D:\website\localhost\index.php(24): ErrorHandle-&amp;<span class="entity">gt;</span>test('m')</span>
#3 {main}
  thrown in &lt;<span class="start-tag">b</span>&gt;D:\website\localhost\index.php&lt;/<span class="end-tag">b</span>&gt; on line &lt;<span class="start-tag">b</span>&gt;18&lt;/<span class="end-tag">b</span>&gt;&lt;<span class="start-tag">br</span><span class="error"><span class="attribute-name"> /</span></span>&gt;</pre>
<p> </p>
<p>注意红色高亮的部分~~</p>
<p>感觉PHP修复Bug还是比较快的</p>

相关推荐

    php bug 扫描器 审计代码神器

    在IT行业中,代码的安全性是至关重要的,尤其是对于使用PHP语言构建的应用程序。"php bug 扫描器 审计代码神器"是一个专门针对PHP代码...在日常开发中,我们应该重视代码审计,将其视为提高软件质量不可或缺的一部分。

    软件测试与常见Bug大全

    2. 性能Bug:当软件在特定条件下运行缓慢、资源消耗过高或者响应时间过长时,就可能出现性能问题。这需要通过压力测试和负载测试来识别。 3. 兼容性Bug:软件在不同操作系统、浏览器或设备上的表现不一致,比如在...

    php7.1+mysql5.0+bugfree.rar

    然而,网上流传的版本可能与当前的环境不兼容,导致安装或运行过程中出现各种问题。本文将详细介绍如何在PHP7.1和MySQL5.0环境下成功部署并使用BugFree,以解决这些困扰。 一、BugFree简介 BugFree是一款基于Web的...

    bug管理规范及流程.docx

    - 开发已修复的 bug:将 bug 状态置为已解决,同时添加说明验证版本号、错误原因、解决办法。 - 开发认为不是 bug:将 bug 状态置为已拒绝,指派给 bug 提出者,同时注明拒绝理由。 - 开发已修复,测试验证通过的...

    bugfree安装出现问题的解决方法

    如果在安装过程中出现与MySQL相关的错误,首先检查当前WAMP服务器中MySQL的版本是否符合bugfree的要求。若不匹配,需按照以下步骤调整: 1. **访问PHP设置**:打开WAMP控制面板,进入“PHP设置”,选择“PHP扩展”...

    PHP在线考试系统PPFrame v2.0.20130829.zip

    修复bug:批量上传错误提示问题 修复漏洞:修复了一个注入漏洞   PPFrame Exam简称PPExam是使用PHP开发的免费在线考试系统。PPExam 是一个通用的在线考试系统,现在基本能模拟所有考试。 学校可以使用PPExam组织...

    kindeditor v3.4.3

    * BUG: 修改了在IE上HTML属性值里输入JS代码时格式出现错误的问题。 * BUG: 修改了cssPath属性为空时加载首页的问题。 * BUG: 修改了当浏览器出现滚动条并拖动调整大小时控制不住的问题。 * BUG: 修改了embed代码...

    解决weblogic923 BUG:8194412补丁包

    解决weblogic923 BUG:8194412补丁包 weblogic日志报如下错误: Caused by: java.lang.RuntimeException: javax.management.remote.JMXServerErrorException: java.lang.AssertionError: Registered more than one ...

    bugfree安装常见问题

    - 在安装过程中可能会遇到错误提示,如“ERROR OCCUR TO /bugfree/install.php”。 - **解决方案**: - 定位到`bugfree/Schema.php`文件,并使用文本编辑器打开。 - 将文件中所有的`TYPE=MyISAM`替换为`ENGINE=...

    DeSmuME 0.9.10源代码

    bug: fix a ton of old, broken cpu opcodes and CP15 logic bug: return Z1 and Z2 from TSC (fixes some touch logic) bug: gba slot save type detection improved bug: handle unusual rom headers more ...

    mantis中bug描述说明

    - **缺陷类型**:将Bug归类为功能、用户界面、需求或性能问题,帮助开发团队识别问题的根源,如功能实现错误、界面显示问题、需求不符或性能下降。 通过规范化的Bug描述和详细的分类信息,Mantis可以帮助团队更高效...

    bug管理规范及流程.pdf

    * 开发认 为不是 bug:将 bug 状态置为已拒绝 * 开发已修复,测试验证通过的 bug:将 bug 状态置为关闭 * 开发已修复,测试验证不通过的 bug:将 bug 状态置为打回(激活) Bug 跟踪类别 -------------- * bug:...

    ThinkPHP提示错误Fatal error: Allowed memory size的解决方法

    但是,在使用ThinkPHP时,开发者可能会遇到一个让人头疼的问题——内存限制错误(Fatal error: Allowed memory size)。这通常发生在处理大量数据或执行内存密集型操作时,服务器分配给PHP脚本的内存被耗尽,从而...

    Linux环境下BugFree的安装与相关问题解决

    在Linux环境下,BugFree是...记得在实际操作过程中,详细阅读文档和错误信息,这将有助于更快地解决任何可能出现的问题。同时,利用`linux安装bugfree.txt`文件提供的解决方案,可以更有效地处理安装过程中遇到的挑战。

    BUG管理规范BUG管理规范BUG管理规范

    * 安全性 BUG:包括数据有效性检测不合理、重要数据在传输中没有加密、缺少身份认证机制或认证不合理、数据产生缺乏随机性、网络安全性等。 * 可靠性 BUG:包括数据存贮的可靠性、业务处理的可靠性、硬件可靠性、...

    meteor-bootstrap-sass-bug:回购以重现错误

    脚步: $ meteor # won't work# While Building the application:# meteor-bootstrap-sass-bug.sass: Scss compiler error: undefined# /tmp/meteor-bootstrap-sass-bug/meteor-bootstrap-sass-bug.sass:1: error: ...

    mantis中的bug状态变化流程

    Mantis是一款开源的缺陷跟踪系统,它用于管理软件开发中的错误报告或称为“bug”的状态。在Mantis中,bug的状态变化流程对于整个项目的测试和运维过程至关重要,因为它确保了问题的有效跟踪和解决。以下是对Mantis中...

Global site tag (gtag.js) - Google Analytics