Home  >  Article  >  php教程  >  PHP错误: Exception thrown without a stack frame in Unknown o

PHP错误: Exception thrown without a stack frame in Unknown o

WBOY
WBOYOriginal
2016-06-06 19:44:101584browse

来自:网易博客 就目前我的了解,在两种情况下,PHP会报 Exception thrown without a stack frame in Unknown on line 0这种错误: 1)异常捕捉用了set_exception_handler导向,Exception里面执行另一个Exception 如下面这段代码,就会出现这种问题: http://

来自:网易博客

就目前我的了解,在两种情况下,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

<span>function</span> error_handler(<span>$code</span>, <span>$message</span>, <span>$file</span>, <span>$line</span><span>)
{
    </span><span>if</span> (0 == <span>error_reporting</span><span>())
        </span><span>return</span><span>;
        
    </span><span>throw</span> <span>new</span> ErrorException(<span>$message</span>, 0, <span>$code</span>, <span>$file</span>, <span>$line</span><span>);
}
</span><span>function</span> exception_handler(<span>$e</span><span>)
{
    </span><span>//</span><span> ... normal exception stuff goes here</span>
    <span>print</span> <span>$undefined</span>; <span>//</span><span> This is the underlying problem</span>
<span>}
</span><span>set_error_handler</span>("error_handler"<span>);
</span><span>set_exception_handler</span>("exception_handler"<span>);
</span><span>throw</span> <span>new</span> <span>Exception</span>("Just invoking the exception handler");

exception_handler函数内print $undefined;这行本身会抛出一个异常,而他又去调用set_exception_handler的exception_handler函数,死循环了。

解决办法:不要在一个Exception里面执行另一个Exception

上面的问题可以用try ... catch的方式,如exception_handler改成下面这样:
 

<span>function</span> exception_handler(<span>$e</span><span>)
{
    </span><span>try</span><span>
    {
        </span><span>//</span><span> ... normal exception stuff goes here</span>
        <span>print</span> <span>$undefined</span>; <span>//</span><span> This is the underlying problem</span>
<span>    }
    </span><span>catch</span> (<span>Exception</span> <span>$e</span><span>)
    {
        </span><span>print</span> <span>get_class</span>(<span>$e</span>)." thrown within the exception handler. Message: ".<span>$e</span>->getMessage()." on line ".<span>$e</span>-><span>getLine();
    }
}</span>

2) 在析构函数抛出异常

参考这个bug:http://bugs.php.net/bug.php?id=33598

下面的代码就会报这个错误:

<span>class</span><span> test {
    </span><span>function</span><span> __construct() {
        </span><span>echo</span> "Construct\n"<span>;
    }

    </span><span>function</span><span> greet() {
        </span><span>echo</span> "Hello World\n"<span>;
    } 

    </span><span>function</span><span> __destruct() {
        </span><span>echo</span> "Destruct\n"<span>;
        </span><span>throw</span> <span>new</span> <span>Exception</span>( 'test'<span> );
    }
}

</span><span>$test</span> = <span>new</span><span> test();
</span><span>$test</span>->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处理了。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn