ホームページ  >  記事  >  バックエンド開発  >  PHP 原則の例外メカニズムの詳細な分析_PHP チュートリアル

PHP 原則の例外メカニズムの詳細な分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:34:56828ブラウズ

PHP の例外メカニズムの原理は何ですか?

PHP で個別に実行可能な op 配列の最後にある ZEND_HANDLE_EXCEPTION は何に使用されますか?

先週、blue5tar が質問しました。 、onError は明らかに実行されますが、onException は実行されません。なぜですか?」。

コードをコピー コードは次のとおりです:

function onError($errCode, $errMesg , $ errFile, $errLine) {
echo "エラーが発生しました";
新しい例外($errMesg);

function onException($e) {
echo $e->getMessage()
} set_error_handler( "onError");

set_Exception_handler("onException");

/* 私はファイルに名前を付けないので、このファイルは存在しません*/


実行結果:


コードをコピー
コードは次のとおりです: エラーが発生しました PHP 致命的なエラー: main(): 必要な 'laruence.php を開くことができませんでした

まず第一に、Require にfind 問題がなければ、2 つのエラーが次々にスローされます。


コードをコピーします。 コードは次のとおりです:
1. PHP がこのファイルを開こうとするとスローされます 2. E_COMPILE_ERROR: ファイルを開くための PHP 関数から、失敗後に がスローされます
そして、set_error_handler が E_COMPILE_ERROR エラーをキャッチできないことがわかっています:

次のエラー タイプは、ユーザー定義関数では処理できません: E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING、および set_error_handler() が呼び出されるファイルで発生する E_STRICT のほとんどは

つまり、onError では最初の WARNING エラーのみがキャッチされ、onError でスローされた例外がデフォルトの例外ハンドラでキャッチされないのはなぜでしょうか。 ?

これは PHP の例外メカニズムについてです

オペコードを理解している学生 (オペコードの PHP 原理を深く理解している学生) は、PHP5.3 より前では、各 op 配列 (ファイル、関数、メソッド) がZEND_HANDLE_EXCEPTION、そしてこのオペコードは何に使われるのでしょうか?

PHP では、例外がスローされると、この ZEND_HANDLE_EXCEPTION を実行するために各オペ配列の最後の行にジャンプすることがわかります。疑似コードは次のとおりです:



コードをコピーします

コードは次のとおりです:
void on_throw_Exception(zval *Exception TSRMLS_DC) { 1. 例外がスローされたかどうかを確認します2. 次の例外を記録します3. シリアルを記録します。実行される演算行の番号
4. 次に実行される演算行のシリアル番号 = 現在の演算配列の最後のもの
}


まあ、IP レジスタを書き換えるのと同じように、次に実行するop行、これによりプログラムの流れが変わり、ZEND_HANDLE_EXCEPTIONの処理ロジックに入ります

ZEND_HANDLE_EXCEPTIONでは、try catchに例外があるかどうかを判定します



コードをコピーします

コードは次のとおりです:
そうであれば、実行される次の演算行を最初のキャッチの演算行として設定し、そうでない場合は実行を続行します。不要な変数と opline を削除し、実行プロセスを直接終了します はい 生徒たちは次のように尋ねます。実行が完了し、LOOP が終了すると、デフォルトの例外処理関数があるかどうかが判断され、存在する場合はその関数が呼び出されます。



コードをコピーします。 コードは次のとおりです。 /Execute
zend_execute(EG(active_op_array) TSRMLS_CC);
if (EG(例外)) {
if (EG(user_Exception_handler)) {
ユーザー定義のデフォルト例外ハンドラーを呼び出す
} else {
キャッチされない例外
} } else { 例外なし} destroy_op_array(EG(active_op_array) TSRMLS_CC);
efree(EG(active_op_array));
PHP 原則の例外メカニズムの詳細な分析_PHP チュートリアル
PHP 例外プロセス
PHP が致命的エラーに遭遇すると、直接 zend_bailout が実行され、zend_bailout によりプログラム フローは上記のコード セグメントを直接スキップします。これは直接終了 (longjmp) としても理解され、user_Exception_handler につながります。何も影響を与える可能性はありません

これを理解すると、記事の冒頭の質問の理由が非常に明確になると思います。では、なぜ独立して実行されるすべての演算配列がこの ZEND_HANDLE_EXCEPTION になるのでしょうか? 最も単純なことは、関数がスローされない場合、この演算コードは明らかに不要であるということです。はい。スローの瞬間にのみ、ZEND_HANDLE_EXCEPTION オペコードが動的に生成されます。

例外処理が変更されました。ドミトリー)



http://www.bkjia.com/PHPjc/322299.html

www.bkjia.com

http://www.bkjia.com/PHPjc/322299.html技術記事 PHP の例外メカニズムの原理は何ですか? PHP で個別に実行可能な op 配列の最後にある ZEND_HANDLE_EXCEPTION は何に使用されますか? 先週、... という質問から始めましょう。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。