PHP错误: Exception thrown without a stack frame in Unknown o
来自:网易博客 就目前我的了解,在两种情况下,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处理了。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、
