#エラーと例外
エラーは、構文エラーなど、プログラム自体のエラーを理解できます。例外は、プログラムが期待どおりに動作しない場合や、通常の処理に従わない場合に発生しやすく、PHP 言語の場合、エラーと例外を処理するメカニズムがまったく異なるため、混乱が生じやすいです。 たとえば、例外をキャッチして 0 による除算の状況を処理したいのですが、例外がキャッチされる前に、PHP によってエラーがトリガーされます。try { $a = 5 / 0; } catch (Exception $e) { $e->getMessage(); $a = -1; // 通过异常来处理 $a 为 0 的情况,但是实际上,捕获不到该异常 } echo $a; // PHP Warning: Division by zeroつまり、PHP は、除数が 0 の場合にエラーとして状況をトリガーし、自動的に例外をスローしないため、例外をキャッチできません。同様に、多くの場合、PHP は自動的に例外をスローできません。例外は、if-else ステートメントを使用し、throw メソッドと組み合わせて手動でのみスローできます。 上記の状況は主に、例外メカニズムが PHP のオブジェクト指向への進化の産物であるために発生します。これ以前は、PHP のエラー報告は主にエラー メカニズムを通じて行われていたため、多くの場合、PHP エラーは例外よりも価値があります。ただし、PHP7 ではこの 2 つが統合され、エラーを例外のようにスローできるようになりました (この部分については例外セクションで説明します)。
エラー レベル
PHP のエラーは、スクリプトの適切な実行を妨げる異常な状況として理解できます。 5 つのカテゴリに分類されます 1.解析エラー または
構文エラー - 構文解析エラー。このエラーが発生した後、スクリプトは実行できませんまったく;
致命的エラー - 致命的なエラー。このエラーが発生すると、後続のスクリプトは実行を続行できません;
警告エラー - 不適切な場所が表示されます。スクリプトは実行を続行できます。
Notice Error - 不適切な問題が発生しましたが、程度は警告エラーより低いため、スクリプトは実行を続行できます。実行を継続します;
非推奨のエラー - この使用は推奨されず、将来放棄される可能性があります。スクリプトは実行を継続できます;
解析エラー 例 - ステートメントの最後にセミコロンがありません
echo "abc" // PHP Parse error: syntax error, unexpected end of file, expecting ',' or ';
致命的エラー例 - 非-existent function
echo "before\n"; foo(); echo "after"; // 本行无法继续执行 // before // PHP Fatal error: Uncaught Error: Call to undefined function foo()警告エラーの例 - 存在しないファイルが導入されています
$a = "foo"; include('bar.php'); echo $a; // 程序继续执行 // PHP Warning: include(bar.php): failed to open stream: No such file or directory ... // foo Notice Error 示例 - 输出不存在的变量 echo $foo; echo 12345; // PHP Notice: Undefined variable: foo // 12345
非推奨のエラー 例 - 一部の文字列関数 文字列の代わりに数値を渡す
strpos('12345', 3); // PHP Deprecated: strpos(): Non-string needles will be interpreted as strings in the futureデフォルトのトリガー メッセージに加えて、ユーザーは set_error_handler 関数を使用してエラー処理をカスタマイズすることもできます。例外を除くほとんどのエラー タイプはカスタマイズできます。
E_ERROR、
E_PARSE、
E_CORE_ERROR、
E_CORE_WARNING、
E_COMPILE_ERROR、
E_COMPILE_WARNING 。
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixedExample
<?php // E_ALL - 处理全部错误类型 set_error_handler('customError', E_ALL); /** * @param int $errno 错误的级别 * @param string $errstr 错误的信息 * @param string $errfile 错误的文件名(可选) * @param string $errline 错误发生的行号(可选) */ function customError(int $errno, string $errstr, string $errfile, string $errline) { echo sprintf('错误消息为 %s', $errstr); } $a = 5 / 0; // 错误消息为 Division by zeroユーザーは、trigger_error 関数を使用してユーザーレベルのエラー (E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE、E_USER_DEPRECATED) を手動でトリガーすることもできます。 。
function division($a, $b) { if($b == 0){ @trigger_error("0 不能作为除数", E_USER_NOTICE); return -1; } return $a / $b; } echo division(10, 0);
エラー関連の構成
エラー処理に関連する一般的な構成#error_reporting - エラー報告レベルの設定 ##●
display_errors
#● display_startup_error
- PHP を表示するかどうか起動 処理中の表示
#log_errors
-実行中のスクリプトのエラー情報をサーバーエラーログまたはerror_logに記録するかどうかを設定
「モダンPHP」では4つを提案していますルール # PHP にエラーを報告させるようにしてください。
# 開発環境ではエラーを表示する必要があります。
## ● 運用環境ではエラーを表示してはなりません。 ● エラーは開発環境と運用環境の両方で記録する必要があります。開発環境の推奨構成display_errors = On display_startup_error = On error_reporting = -1 log_errors = On運用環境の推奨構成環境
display_errors = Off display_startup_error = Off ; 报告 Notice 以外的所有错误 error_reporting = E_ALL & ~E_NOTICE log_errors = On
Symfonyエンコーディング仕様関連
例外およびエラーメッセージ文字列は、sprintf ;#を使用して結合する必要があります。
##throw new CommandNotFoundException(sprintf('コマンド "%s" が存在しません。', $name));エラーの種類が
@
@trigger_error("foo", E_USER_DEPRECATED);関連する php の知識については、こちらをご覧ください。
phpチュートリアル
以上がPHP エラー処理を分析する (コア機能)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。