ホームページ >バックエンド開発 >PHPチュートリアル >PHP エラーと例外処理の概要
PHP には、エラーと例外処理に関連する一連の関数が組み込まれています。この記事では、これらの関数のいくつかについて詳しく説明します。
http://leo108.com
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 のブログ
これら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
スタック トレース: 例外
/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
thrown in /tmp/error.php on line 9
http://leo108.com/pid-2216.asp
结论:调用了两次错误处理逻辑,一次异常处理逻辑。
推酷是个无耻的网站
throw new Exception('origin exception');
输出: