【问题标题】:How do I track down an "Exception thrown without a stack frame in Unknown on line 0" in PHP?如何在 PHP 中跟踪“在第 0 行的未知中抛出没有堆栈帧的异常”?
【发布时间】:2011-04-09 09:30:19
【问题描述】:

我正在使用 PHP 编写一个大型(继承的)代码库,并且错误 Exception thrown without a stack frame in Unknown on line 0 已开始出现在每个页面的底部。我理解错误的含义:在无法抛出的地方抛出异常。我什至设法追查到它——它发生在调用关闭函数的时间。

我已经记录了在register_shutdown_function 注册的所有功能,但这些功能都没有发生。不幸的是,我似乎无法获得更多信息。我知道最后一次成功调用的关闭函数是什么,但我不知道在该函数和错误发生点之间执行了什么代码。我什至不知道 PHP 机器的哪个部分正在调用最后一个关闭函数。它可能与日志框架、会话框架或六种事物有关。

有谁知道如何查明错误发生的位置?

【问题讨论】:

  • 继承的代码是否使用了 set_error_handler() 或 set_exception_handler() 函数?
  • 我不这么认为。对该函数的唯一引用是在 Zend 框架中的文档字符串中。
  • PHP 5.3.6 修复了这个问题让我们说“有点”。详情请见php.net/archive/2011.php#id2011-03-17-1

标签: php


【解决方案1】:

我在PHPUnit 收到了这个问题。我在function tearDown 中添加了以下代码,并帮助我获取实际错误。您应该将析构函数包装在 try-catch 块中,因为只有当异常超出析构函数时堆栈帧才会丢失。可能这也可以帮助其他人。 Source

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

【讨论】:

    【解决方案2】:

    这可能发生在没有堆栈帧的析构函数和异常处理程序中。但是由于该消息非常有帮助,您唯一的选择是尝试使用echo 来查找错误(也许ob_end_flush())。可能是析构函数正在抛出异常,或者正在调用抛出异常的函数。找到错误函数后,在异常抛出部分添加 try...catch。

    请注意,如果您的框架使用自己的错误处理,您必须在 PHP 配置中关闭警告和通知。特别是如果你有类似ErrorException 的东西,因为它会将警告变成异常。

    【讨论】:

      【解决方案3】:

      我也收到同样的错误消息。 Awardspace 将 MySQL 数据库配额设置为 50mb。使用 PHPmyAdmin 优化文件显示大小为 34 mb,但在 cPanel 上显示为 57mb。每次访问我的网站并出现此错误消息时,我需要做的就是登录到奖励空间,选择数据库,管理并重置文件权限。然后错误消息消失,我的网站恢复了。

      【讨论】:

        【解决方案4】:

        刚刚在部署到运行 PHP 5.3.5 的 Ubuntu 11.04 服务器的 Web 应用程序中遇到相同错误后发现了您的问题。我同意@Eisberg 的观点,这个问题似乎只是 PHP 5.3 版本的问题,因为在我的应用程序已部署到的其他环境中的以前的其他 PHP 版本中没有出现该错误。

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

        为了找出导致这种神秘行为的原因,我使用 XDEBUG 和我的 IDE (Eclipse) 调试了应用程序,发现我的一个库在没有会话数据时试图访问和修改 global$_SESSION 变量放。将我的代码包装在 if 语句中检查 isset($_SESSION) 使问题消失了。

        为什么异常没有完全冒泡到浏览器,就像其他错误在尝试访问未设置的变量时所做的那样,对我来说完全是个谜,尤其是当我设置了错误设置时,但是也许改变error_reporting() 中的设置会有所作为。

        错误处理设置,供参考:

        error_reporting(E_ALL | E_STRICT);
        ini_set("display_errors", 1);
        ini_set("html_errors", 1);
        

        【讨论】:

        • 我有同样的问题,并将其分解为导致错误的 if ($foo) 条件。发生这种情况是因为 $foo 尚未设置。使用 if (!empty($foo)) 将解决问题。由于某些原因,相同的代码不会在同一服务器上的旧版应用程序中引发异常。带有错误的新应用程序使用 Symfony 组件发生。我将看看 PHP5.3(是的,仍然必须使用它)问题。不过貌似 Symfony 也在这里设置了一些特殊的 error_reporting?
        【解决方案5】:

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

        你应该寻找这些方法,看看这里有没有奇怪的东西出现。

        【讨论】:

          猜你喜欢
          • 2012-05-16
          • 1970-01-01
          • 2011-06-05
          • 2013-01-16
          • 2011-01-21
          • 1970-01-01
          • 2011-10-21
          • 2012-07-11
          • 2018-12-03
          相关资源
          最近更新 更多