代码之家  ›  专栏  ›  技术社区  ›  Chris B.

如何在PHP中跟踪“在未知的第0行中没有堆栈帧的情况下抛出异常”?

php
  •  6
  • Chris B.  · 技术社区  · 14 年前

    我正在用PHP处理一个大型(继承的)代码库,错误是 Exception thrown without a stack frame in Unknown on line 0 开始出现在每一页的底部。我理解错误的含义:一个异常会被抛出一个它不能抛出的地方。我甚至设法跟踪到了一些“关闭”功能被调用期间发生的情况。

    我已经将所有注册到 register_shutdown_function 而且这些都不会发生。不幸的是,我似乎无法获得更多的信息;我知道要成功调用的最后一个关闭函数是什么,但是我不知道在这个函数和发生错误的点之间执行什么代码。我甚至不知道PHP机器的哪个部分在调用最后一个关闭函数。它可能与日志框架或会话框架有关,也可能与半打其他东西有关。

    有人知道如何确定错误发生的位置吗?

    5 回复  |  直到 8 年前
        1
  •  6
  •   TRiG    8 年前

    这可能发生在没有堆栈帧的析构函数和异常处理程序中。但是由于信息非常有用,您唯一的选择是尝试使用 echo 找到虫子(也许 ob_end_flush() )可能是析构函数正在引发异常,或者正在调用引发异常的函数。找到bugy函数后,在异常抛出部分周围添加一个try…catch。

    注意,如果您的框架使用自己的错误处理,那么您必须关闭PHP配置中的警告和注意事项。尤其是如果你有 ErrorException ,因为它将警告转换为异常。

        2
  •  5
  •   Alfwed    14 年前

    当异常处理程序或错误处理程序(也可能在关闭函数中)中引发异常时,会出现此消息。

    你应该找这些方法看看这里有没有什么奇怪的地方。

        3
  •  0
  •   Industrial    13 年前

    在部署到运行php 5.3.5的Ubuntu11.04服务器上的Web应用程序遇到同样的错误后,才发现了您的问题。我同意@eisberg的观点,这个问题似乎是专门针对php 5.3版本的问题,因为我的应用程序部署到的其他环境中以前的其他php版本没有出现错误。

    正如@jmz所提到的,我还使用了一个错误处理程序,它将错误转化为异常,以便在我的登台服务器上进行调试。

    为了找出造成这种神秘行为的原因,我使用xdebug&my-ide(eclipse)调试了应用程序,发现我的一个库试图访问和修改全局 $_SESSION 变量,当没有设置会话数据时。在if语句检查中包装我的代码 isset($_SESSION) 使问题消失。

    为什么这个异常并没有完全冒泡到浏览器,就像其他错误在试图访问非设置变量时所做的那样,对我来说是一个完全的谜,特别是当我在错误设置集下面时,但可能会改变 error_reporting() 会有所不同的。

    错误处理设置,供参考:

    error_reporting(E_ALL | E_STRICT);
    ini_set("display_errors", 1);
    ini_set("html_errors", 1);
    
        4
  •  0
  •   andrew    9 年前

    我也收到同样的错误消息。awardspace将MySQL数据库配额设置为50MB。使用phpmyadmin优化文件显示的大小为34MB,但在cpanel中,大小显示为57MB。每次我访问我的网站时,如果出现此错误消息,我需要做的就是登录awardspace,选择数据库、管理和重置文件权限。然后错误消息消失,我的网站就备份了。

        5
  •  0
  •   TIGER mala    8 年前

    我在处理这个问题 PHPUnit . 我在下面添加了代码 function tearDown 帮助我得到实际的错误。您应该将析构函数包装在一个try-catch块中,因为堆栈帧只有在异常超出析构函数时才会丢失。也许这也能帮助别人。 Source

    function __destruct()
    {
        try
        {
        /*
        your code
        */
        }
        catch(Exception $e)
        {
        echo $e->__toString();
        }
    }