ホームページ >バックエンド開発 >PHPチュートリアル >PHP エラー: 0 行目不明でスタック フレームなしで例外がスローされました[再版],thrownstack_PHP チュートリアル
From: NetEase Blog
私の知る限り、2 つのケースで、PHP は次のようなスタック エラーなしでスローされた例外を報告します。行 0 の Unknown のフレーム:
1) 例外キャプチャは set_Exception_handler ガイドを使用し、別の例外が例外内で実行されます
たとえば、次のコードでは、この問題が発生します:
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 関数内で $unknown; を印刷すると、それ自体が例外をスローし、その後 set_Exception_handler の例外_handler 関数を呼び出して、無限ループを作成します。
解決策: 例外内で別の例外を実行しないでください。
上記の問題は 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) デストラクターで例外をスローする
このバグを参照してください: http://bugs.php.net/bug.php?id=33598
次のコードはこのエラーを報告します。 リーリー
現在の解決策:
1. デストラクターで例外をスローしないでください。
2. 終了時にデストラクターが実行されるため、このクラスの設定を手動で解除して例外をキャッチする必要があります。
たとえば、上記の例では、最後に unset($test) の行を追加すると、プログラムは throw new Exception( 'test' ); を報告し、この例外をキャッチします。
上記の 2 つの状況は、PHP バージョン 5.2.11 で発生します。理由については、PHP のバグ 33598 が 2005 年に報告されたためだと思います。バグのステータスはクローズされており、公式はこれを考えていないことを示しています。はバグ、またはバグとして扱われません。
このファイルが別のファイルに含まれていない場合。 。以下を試すことができます。
ファイルに UTF-8 エンコーディングを使用しないでください。 。
下のコードを上部に移動します。 。いずれにしても、含めた PHP ファイルには HTML コードがありません。
php.ini を確認し、SESSION 一時ファイルが保存されているパス、PHP からアクセスできるかどうかに注意してください。
エンコードが異なり、UTF-8のものとUnicodeのものがあるので、データベースに挿入するときはUTF-8にして、読み出すときはそのままUTF-8にしてください。