エラー
プログラムを作成する場合、エラーは避けられません。エラーを見つけて特定し、修正する方法は科学です。今日は、php7 以降のエラーと例外について説明します。
エラーの分類
一般的なエラーは、構文エラー、実行時エラー、および論理エラーに分類されます。構文エラーと実行時エラーはトラブルシューティングが簡単ですが、論理エラーはそれほど単純ではありません。比較演算 == を代入演算 = として判定するときに何度も書いてきましたが、私のような人間には見つけるのが難しいです。一般に、経験を積むほど(落とし穴を踏む回数が増えるほど)、論理的な間違いを見つけるのが容易になります。
エラー出力の制御
エラーのタイムリーな検出を容易にするために、開発段階ではエラー出力をオンにすることが一般的に推奨されます。安全性と美しさのために、オンライン段階でのエラーをオフにします。
php は、ブラウザと cli へのエラーの出力を制御するパラメータ display_errors を提供します。これを変更するには、php.ini ファイルを変更する方法と、ini_set 関数を使用する方法の 2 つがあります。以下に、ini_set を使用してマスキング エラー出力を設定するコードを示します。
<?php ini_set('display_errors', 0); echo $a; echo 0; date(); echo 1;
プログラムは正常に 01 を出力しますが、エラー情報は出力しません。
#エラー報告レベル
一般に 4 つのカテゴリに分類されます
#注意注意レベルのエラー
# 输出所有级别错误 error_reporting(E_ALL); # 输出所有级别除了E_NOTICE error_reporting(E_ALL & ~E_NOTICE); # 输出所有级别除了E_NOTICE和E_WARNING error_reporting(E_ALL & ~(E_NOTICE | E_WARNING));display_errors と error_reporting の違い
display_errors はエラーを出力するかどうかを制御するために使用され、error_reporting はエラーのレベルを制御するために使用されます。出力ミス。通常、ini_set('display_errors', 0); // 关闭错误输出
error_reporting(E_ALL); // 输出所有级别的错误信息
を使用します。上記の構成は通常オンライン段階にあり、すべてのエラー出力がブロックされますが、エラーは PHP エラー ログに記録されます。エラー ログへのパスは、オプション error_log によって決定されます。
#エラーによるプログラムへの影響
プログラムに構文エラーがある場合、プログラムは実行されません。エラーレベルのエラーが発生した場合、プログラムは下方向の実行を停止します。警告レベルのエラーは、プログラムの下位実行には影響しません。 error_reporting(E_ALL); // 输出所有级别的错误信息
echo $a;
echo 0;
date();
echo 1;
new a;
echo 2;
このプログラムは 0 と 1 を出力しますが、2 は出力しません。
ユーザー定義のエラー
trigger_error() 関数はユーザーレベルのエラーを生成する可能性があります。エラー レベルには、E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE などが含まれます。<?php
trigger_error('这是notice级别错误', E_USER_NOTICE);
trigger_error('warning错误', E_USER_WARNING);
trigger_error('deprecated', E_USER_DEPRECATED);
trigger_error('error错误', E_USER_ERROR);
カスタマイズされたエラー処理set_error_handler - ユーザー定義のエラー処理関数を設定します。関数のプロトタイプは次のとおりです:
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
関数の最初のパラメータはコールバック関数で、プロトタイプは次のとおりです:
handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
error エラー レベル
<?php define('DEBUG', false); set_error_handler('error_handler'); if (DEBUG) { ini_set('display_errors', 'On'); } else { ini_set('display_errors', 'Off'); } function error_handler($errLevel, $errInfo, $errFile, $errLine) { echo "ErrorLevel:$errLevel: $errInfo In $errFile ON $errLine" . PHP_EOL; } echo $a;
异常和错误时有区别的,错误一般是指我们能控制的问题,比如变量名写错了,或者判断条件写的不错,导致死循环。而异常通常指那些难以控制的、意料外的错误,比如mysql连接不上,文件句柄打开失败等情况。
php的异常也是经典的try catch finally,但和一般的异常处理不一样的是,绝大部分的异常需要自行抛出。抛出异常使用throw关键字完成。php也支持捕获多个异常。
<?php class MyError extends Exception { public function printErr () { echo '出错啦'.PHP_EOL; } } class YourError extends Exception { public function printErr () { echo 'errors'.PHP_EOL; } } try { if (mt_rand(0,1)) { throw new MyError('错误'); } else { throw new YourError('错误'); } } catch (MyError $e) { $e->printErr(); } catch (YourError $e) { $e->printErr(); } finally { echo '不管有没有异常,我都会被执行'.PHP_EOL; }
php的异常如果没有捕获,则会报Fatal Error错误,程序不会继续向下执行。
PHP 7 错误处理
PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。 Error 和 Exception 都实现了 Throwable 接口
异常处理
设置默认的异常处理程序,有try/catch捕获的话这个异常函数就不会执行,反之就会执行异常处理函数,而且执行的话,脚本将不会继续执行。
php使用set_exception_handler来设置用户自定义的异常处理函数 ,函数原型如下:
set_exception_handler ( callable $exception_handler ) : callable
回调函数的原型如下:
handler ( Throwable $ex ) : void
下面,我们来写一个异常处理函数
<?php class MyError extends Exception { public function printErr () { echo '出错啦'.PHP_EOL; } } class YourError extends Exception { public function printErr () { echo 'errors'.PHP_EOL; } } try { if (mt_rand(0,1)) { throw new MyError('错误'); } else { throw new YourError('错误'); } } catch (MyError $e) { $e->printErr(); } catch (YourError $e) { $e->printErr(); } finally { echo '不管有没有异常,我都会被执行'.PHP_EOL; }
统一处理错误与异常
学完了错误与异常,知道如何去使用自定义错误处理和异常处理,现在我们就可以统一处理错误与异常了。
<?php class Errors { // 处理非致命错误 static function errorHandle($errLevel, $errInfo, $errFile, $errLine) { echo '错误:'.PHP_EOL; print_r(['file' => $errFile, 'level' => $errLevel, 'line' => $errLine, 'info' => $errInfo]); } // 处理致命错误及异常 static function exceptionHandle(Throwable $ex) { echo '异常:'.PHP_EOL; print_r(['file' => $ex->getFile(), 'level' => $ex->getCode(), 'line' => $ex->getLine(), 'info' => $ex->getMessage()]); } } set_error_handler(['Errors', 'errorHandle']); set_exception_handler(['Errors', 'exceptionHandle']);
以上がphp7でのエラーと例外の処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。