Heim  >  Artikel  >  php教程  >  PHP错误: Exception thrown without a stack frame in Unknown on line 0[转载],thrownstack

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

WBOY
WBOYOriginal
2016-06-13 09:28:22950Durchsuche

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

来自:网易博客

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

我这开启session错在哪儿?

如果这个文件不是被另一个文件包含调用的话。。你可以试试下面的做法。

文件不要用 UTF-8 编码。。

把你下面的代码移到上面去。。反正你包含的 PHP 文件里面也没有 HTML 码。

检查你的 php.ini 注意 SESSION 临时文件保存的路径,是否可以被 PHP 访问。
 

thinkphp在读取sqlite数据时为何会出现中文乱码?指点

编码不同,有的是utf-8,有的是Unicode,所以会出现为乱码,插入数据库的时候设置成utf-8,读取出来也用utf-8就行了。
 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn