PHP错误: Exception thrown without a stack frame in Unknown on line 0[转载]

王朝学院·作者佚名  2016-05-25
窄屏简体版  字體: 小  |  中  |  大  |  超大  

php错误: Exception thrown without a stack frame in Unknown on line 0[转载]来自:网易博客

就目前我的了解,在两种情况下,PHP会报 Exception thrown without a stack frame in Unknown on line 0这种错误: 1)异常捕捉用了set_exception_handler导向,Exception里面执行另一个Exception 如下面这段代码,就会出现这种问题: http://de.php.net/manual/de/function.set-exception-handler.php#88082 function error_handler($code, $message, $file, $line){ if (0 == error_reporting()) return; throw new ErrorException($message, 0, $code, $file, $line);}function exception_handler($e){ // ... normal exception stuff goes here PRint $undefined; // This is the underlying problem}set_error_handler("error_handler");set_exception_handler("exception_handler");throw new Exception("Just invoking the exception handler");

exception_handler函数内print $undefined;这行本身会抛出一个异常,而他又去调用set_exception_handler的exception_handler函数,死循环了。 解决办法:不要在一个Exception里面执行另一个Exception 上面的问题可以用try ... catch的方式,如exception_handler改成下面这样: function exception_handler($e){ try { // ... normal exception stuff goes here print $undefined; // This is the underlying problem } catch (Exception $e) { print get_class($e)." thrown within the exception handler. Message: ".$e->getMessage()." on line ".$e->getLine(); }}

2) 在析构函数抛出异常 参考这个bug:http://bugs.php.net/bug.php?id=33598下面的代码就会报这个错误: class test { function __construct() { echo "Construct\n"; } function greet() { echo "Hello World\n"; } function __destruct() { echo "Destruct\n"; throw new Exception( 'test' ); }}$test = new test();$test->greet();

目前的解决办法:

1.不要在析构函数中抛出异常. 2.由于析构函数是在退出时执行的,所以要手动unset这种类,并catch该异常。 比如上面的例子,在最后加一行unset($test),这时程序就会报throw new Exception( 'test' ); 这行有错误,再catch这个异常就行了。 上面两种情况在php 5.2.11版本上都会出现,至于原因我认为PHP可能就是这样处理的,php bug 33598 2005年就报上去了,bug Status为Closed,说明官方并不认为这是一个bug,或不当一个bug处理了。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航