PHP エラーと例外処理の概要

WBOY
WBOYオリジナル
2016-06-23 13:04:171166ブラウズ

PHP のエラーと例外処理の概要

PHP には、エラーと例外処理に関連する一連の関数が組み込まれています。この記事では、これらの関数のいくつかについて詳しく説明します。

http://leo108.com

set_error_handler およびrestore_error_handler

set_error_handler は、プログラムでエラーが発生したときに、対応するエラーをユーザー定義のロジックに引き渡して処理するように設定できます。 leo108 のブログ

しかし、E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING など、set_error_handler で指定されたすべてのエラーをキャプチャできるわけではありません。簡単に言うと、本来プログラムの終了を引き起こすエラーはキャプチャできません。捕獲。 PHP エラーと例外処理の概要

set_error_handler は 1 つのエラー処理ロジックのみを設定できます。 set_error_handler が複数回呼び出された場合、最後のものだけが有効になります:

leo108 のブログ

set_error_handler(function($errno, $errstr){    echo 'catch error1';});set_error_handler(function($errno, $errstr){    echo 'catch error2';});trigger_error('something error');

出力は leo108 のブログです

catch error2

http://leo108.com

サードパーティのコード ベースを作成するときに、呼び出し元のエラー処理に影響を与えずにコード ベースのエラーをキャプチャしたい場合は、restore_error_handler 関数を使用できます: PHP

function third_party_function() {	//第三方类库的错误处理逻辑	set_error_handler(function() {		//一些代码	});	//该第三方类库的逻辑	//一些代码	//复原错误处理逻辑	restore_error_handler();}

このようにして、サードパーティのコード ベースで発生した最初のエラーは、サードパーティのコード ベースのエラー処理ロジックによって捕捉されますが、このサードパーティのコード ベース外のエラーは引き続き元のロジックによって処理されます。

例外

エラー処理ロジックの戻り値が false の場合、PHP は組み込みのエラー処理ロジック (error_reporting の値に基づいて、エラー情報を出力するか、エラー ログを書き込むかなどを判断するなど) を呼び出します。 ; true を返すと、組み込みエラー処理ロジックは呼び出されません。処理ロジックは、カスタム エラー処理ロジックを実行した後、エラーがトリガーされた場所に戻り、実行を継続します。

Tuiku は恥知らずな Web サイトです

error_reporting と @ 記号はエラー処理ロジックの呼び出しには影響しません:

Tuiku は恥知らずな Web サイトです

error_eporting(0);set_error_handler(function($errno, $errstr){    echo 'catch error';});@trigger_error('something error');

上記のコードは出力します:

PHP

catch error

leo108 のブログ

set_error_handler で捕捉できないエラーの場合、一般的なエラーは E_ERROR と E_PARSE の 2 つだけです。前者は、設定値を超えるメモリ使用量、存在しないクラスのインスタンス化、または存在しない関数の呼び出しである可能性があり、後者は通常、セミコロンの欠落などの構文解析エラーです。 E_PARSE の場合、これは構文レベルのエラーであるため、それをキャプチャする方法はありません。ただし、E_ERROR の場合は、 register_shutdown_function と error_get_last で処理できます。 サンプル コードは次のとおりです。

Tuiku は恥知らずな Web サイトです

error_reporting(0);register_shutdown_function(function() { 	$error = error_get_last(); 	if ($error != null && $error['type'] == E_ERROR) {		echo "fatal error catched:" . var_export($error, true); 	}});new test();

出力:

http://leo108.com

fatal error catch:array (

http://leo108.com

'type' => 1、PHP エラーと例外処理の概要

'message' => 'クラス 'test' が見つかりません'、PHP エラーと例外処理の概要

'file ' => '/tmp/error.php',

Tuiku は恥知らずな Web サイトです

'line' => 20,

PHP

)

leo108 のブログ

set_例外ハンドラーと復元_例外ハンドラー

これら2つの機能同様に、登録できる例外処理ロジックは 1 つだけです。復元できるのは、複数の登録のうちの最後の例外処理ロジックのみです。 leo108 のブログ

いくつかの小さな実験

エラー処理ロジックでのエラーのトリガー

set_error_handler(function($errno, $errstr){    echo 'catch error:' . $errstr . PHP_EOL;    trigger_error('error in error handler');});trigger_error('origin error');

出力: leo108 のブログ

catch error:origin error

例外

PHP Notice: /tmp/error のエラー ハンドラーにエラーがあります。 php で15 行目

PHP エラーと例外処理の概要

結論: エラー処理ロジックのエラーを再度捕捉することはできません。 例外

例外処理ロジックで例外がスローされました

set_exception_handler(function(Exception $e){    echo 'catch exception:' . $e->getMessage() . PHP_EOL;    throw new Exception('exception in exception handler');});throw new Exception('origin exception');

出力: TuiKu は恥知らずな Web サイトです

キャッチ例外: 原点例外

TuiKu は恥知らずな Web サイトです

PHP 致命的なエラー: キャッチされない例外 '例外' メッセージ '例外'例外ハンドラー内' /tmp/error.php:15 http://leo108.com/pid-2216.asp

スタック トレース: 例外

0 [内部関数]: {closure}(Object(Exception ))

1 [main]

/tmp/error.php の 15 行目でスロー http://leo108.com

結論: 例外処理ロジックでスローされた例外はキャッチされません http:// leo108.com/pid -2216.asp

例外とエラー処理ロジックが同時に定義され、例外はエラー処理ロジックでスローされ、エラーは例外処理ロジックでトリガーされます

set_exception_handler(function(Exception $e){    echo 'catch exception:' . $e->getMessage() . PHP_EOL;    trigger_error('error in exception handler');});set_error_handler(function($errno, $errstr){    echo 'catch error:' . $errstr . PHP_EOL;    throw new Exception('exception in error handler');});

エラーは外部でトリガーされます

trigger_error('origin error');

出力:

例外

キャッチエラー:原点エラー

http://leo108.com

キャッチ例外:エラーハンドラの例外

http://leo108.com

キャッチエラー:例外ハンドラのエラー

例外

PHP Fatal error: Uncaught exception ‘Exception’ with message ‘exception in error handler’ in /tmp/error.php:9

leo108's blog

Stack trace:

PHP

0 [internal function]: {closure}(1024, ‘error in except…’, ‘/tmp/error.php’, 5, Array)

1 /tmp/error.php(5): trigger error(‘error in except…’)

2 [internal function]: {closure}(Object(Exception))

3 [main]

thrown in /tmp/error.php on line 9

http://leo108.com/pid-2216.asp

结论:调用了两次错误处理逻辑,一次异常处理逻辑。

推酷是个无耻的网站

外部抛出异常

throw new Exception('origin exception');

输出:

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