我正在使用PHP中的大型(继承)代码库,并且错误Exception thrown without a stack frame in Unknown on line 0
已经开始显示在每个页面的底部。我理解错误意味着什么:异常会在某个地方被抛出而无法抛出。我甚至设法在某种程度上跟踪它 - 它正在调用关闭函数期间发生。
我已经记录了所有注册了register_shutdown_function
的函数,而且这些函数都没有发生。不幸的是,我似乎无法获得更多信息;我知道成功调用的最后一个关闭函数是什么,但我不知道在它和错误发生点之间执行了什么代码。我甚至不知道PHP机器的哪个部分正在调用最后一个关闭函数。它可能与日志记录框架,会话框架或其他任何事情有关。
有谁知道如何确定错误发生的位置?
答案 0 :(得分:6)
这可能发生在没有堆栈帧的析构函数和异常处理程序中。但由于该消息非常有用,您唯一的选择是尝试使用echo
来查找错误(也许ob_end_flush()
)。可能是析构函数抛出异常,或者正在调用抛出异常的函数。一旦你找到了buggy函数,添加一个try ... catch抛出异常抛出部分。
请注意,如果您的框架使用自己的错误处理,则必须在PHP配置中关闭警告和通知。特别是如果您有ErrorException之类的内容,因为它会将警告变为异常。
答案 1 :(得分:5)
当异常处理程序或错误处理程序中抛出异常时(或者也可能在关闭函数中),会出现此消息
你应该寻找这些方法,看看这里是否有什么奇怪的东西。
答案 2 :(得分:0)
在部署到运行PHP 5.3.5的Ubuntu 11.04服务器的Web应用程序中遇到相同错误后,找到了您的问题。我同意@Eisberg认为这个问题似乎只是PHP 5.3版本的问题,因为以前的其他PHP版本在我的应用程序部署到的其他环境中没有出现错误。
正如@jmz所提到的,我还使用了一个错误处理程序,它将错误转换为异常,以便在我的登台服务器上更容易地进行调试。
为了弄清楚导致这种神秘行为的原因,我使用XDEBUG& amp;调试了应用程序。我的IDE(Eclipse)并发现我的一个库试图访问&在未设置会话数据时修改全局$_SESSION
变量。将我的代码包含在检查isset($_SESSION)
的if语句中会使问题消失。
为什么异常没有完全冒泡到浏览器,因为其他错误在尝试访问非设置变量时已经完成,这对我来说是一个完全的谜,特别是当我得到以下错误设置时,但是也许改变error_reporting()
中的设置会产生影响。
错误处理设置,供参考:
error_reporting(E_ALL | E_STRICT);
ini_set("display_errors", 1);
ini_set("html_errors", 1);
答案 3 :(得分:0)
我也得到了相同的错误消息。 MySQL数据库配额由awardpace设置为50mb。使用PHPmyAdmin优化文件显示大小为34 mb,但在cPanel处,大小显示为57mb。每当我访问我的网站并发生此错误消息时,我需要做的就是登录奖励空间,选择数据库,管理和重置文件权限。然后错误消息消失了,我的网站又回来了。
答案 4 :(得分:0)
我在PHPUnit
收到了这个问题。我在function tearDown
中添加了以下代码,并帮助我解决实际错误。你应该将析构函数包装在try-catch块中,因为只要异常越过析构函数,堆栈帧就会丢失。可能这也可以帮助别人。 Source
function __destruct()
{
try
{
/*
your code
*/
}
catch(Exception $e)
{
echo $e->__toString();
}
}