ホームページ php教程 php手册 PHP原理の異常メカニズムを徹底分析

PHP原理の異常メカニズムを徹底分析

Jun 13, 2016 pm 12:14 PM
array php 原理 できる 存在する 異常な とは 機構 徹底した分析 独立した

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

PHP の各独立して実行可能な op 配列の最後にある ZEND_HANDLE_EXCEPTION は何に使用されますか?

質問から始めましょう。先週、blue5tar 「次のコードでは、onError は明らかに実行されますが、onException は実行されません。なぜですか?」という質問がありました。

コードをコピー


function onError($errCode, $errMesg, $errFile, $errLine) {
echo "エラーが発生しました";
throw new Exception($errMesg);

関数 onException($e) {
echo $e->getMessage();

set_error_handler( "onError ");

set_Exception_handler("onException");

/* 私はファイルに自分の名前を付けたことがないので、このファイルは存在しません*/
require(" laruence.php" );


実行結果:



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

エラー発生した

PHP 致命的エラー: main(): Failed open required 'laruence.php


まず、Require に見つからない問題が含まれている場合、前方と後方にスロー 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 より前では、独立して実行できるすべてのオペ配列 (ファイル、関数、メソッド) の最後のオペコードが ZEND_HANDLE_EXCEPTION であることを知っています。また、このオペコードは何に使用されますか?
PHP では、例外がスローされると、各操作配列の最後の行にジャンプして、この ZEND_HANDLE_EXCEPTION を実行することがわかります。疑似コードは次のとおりです:



コードをコピーします

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

void on_throw_Exception(zval *例外 TSRMLS_DC) { 1. 例外がスローされたかどうかを確認します2 . 例外を記録します

3. 実行される次の op 行のシリアル番号を記録します

4. 実行される次の op 行のシリアル番号 = 現在の op 配列の最後のもの
}


さて、ip レジスタの書き換えと同じように、次に実行する op 行のシーケンス番号を書き換えると、このように ZEND_HANDLE_EXCEPTION の処理ロジックに入ります。 🎜>
ZEND_HANDLE_EXCEPTION では、この例外が try catch にあるかどうかを判断します。



コードをコピーします。

コードは次のとおりです。

そうであれば、次のように記述します。 実行する op 行を最初の catch op 行として設定し、実行を継続します。 そうでない場合は、いくつかの不要な変数と opline を破棄し、直接終了します。実行プロセス

「set_Exception_handler で設定したデフォルトの例外処理関数 (user_Exception_handler) はいつ有効になるのですか?」と尋ねたい学生もいます。


実行が完了し、LOOP が終了した後のデフォルトの例外処理。関数。利用可能な場合にのみ呼び出します。



コードをコピー

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

//実行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 が致命的エラーに遭遇すると、直接 zend_bailout が実行され、zend_bailout によりプログラム フローは上記のコード セグメントを直接スキップします。これは、直接終了 (longjmp) としても理解されます。これにより、user_Exception_handler が機能しなくなります。

これを理解すると、記事の冒頭の問題の理由が明確になると思います。

最後に、 ZEND_HANDLE_EXCEPTION、おそらく学生もいるでしょう。これが事実である場合、なぜすべての独立して実行可能な op 配列の最後にこの ZEND_HANDLE_EXCEPTION があるのでしょうか? 最も単純な場合、関数に throw がない場合、この opcode は明らかに不要です。へー、とても賢いですね、PHP 5.3 からは、あなたのアイデアに従って調整されています。スローの瞬間にのみ、ZEND_HANDLE_EXCEPTION opline が動的に生成されます。

PHP5 変更ログ:

変更。例外処理に、各 op_array には ZEND_HANDLE_EXCEPTION オペコードが含まれなくなりました (Dmitry)。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

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

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

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

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

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

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

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

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles