エラーと例外
エラーは、構文エラーなど、プログラム自体のエラーを理解できます。例外は、プログラムが期待どおりに実行されない場合や、通常のプロセスに準拠していない場合に発生する傾向があります。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つのカテゴリに分類できます
● 解析エラーまたは構文エラー。 - 構文解析エラー。このエラーが発生すると、スクリプトはまったく実行できなくなります。
● 致命的なエラー。このエラーが発生すると、後続のスクリプトは実行を続行できません。
● 警告エラー - 不適切な場所が発生した場合、スクリプトは実行を続行できます。
●通知エラー - 不適切な場所が発生しましたが、警告エラーよりも程度が低いため、スクリプトは実行を続行できます。
●非推奨エラー - この使用は推奨されず、将来廃止される可能性があります。スクリプトは実行を継続できます。
デフォルトでは、PHP はエラーをトリガーし、エラー レベルと対応するプロンプトを表示します。
解析エラーの例 - ステートメントの最後にセミコロンがありません
echo "abc"
// PHP 解析エラー: 構文エラー、予期しないファイルの終わり、',' または ';を期待しています
致命的エラーの例 - 非-existent function
echo "beforen";
foo();
echo "after"; // この行は実行を続行できません
// before
// PHP 致命的なエラー: キャッチされないエラー: 未定義の関数 foo() の呼び出し
警告エラーの例 - 存在しないファイルの導入
$a = "foo";
include('bar.php');
echo $a; // プログラムは実行を継続します
// PHP 警告: include(bar.php ): ストリームを開けませんでした : そのようなファイルまたはディレクトリはありません ...
// foo
Notice エラーの例 - 存在しない変数を出力する
echo $foo;
echo 12345;
// PHP Notice: 未定義の変数: foo
/ / 12345
非推奨のエラー例 - 一部の文字列関数で文字列の代わりに数値を渡します
strpos('12345', 3);
// PHP 非推奨: strpos(): 将来、文字列以外の針は文字列として解釈されます
例外 デフォルトのトリガーメッセージに加えて、ユーザーは次のこともできます。 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 ] ) : mixed
例
<?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
Symfony コーディング仕様関連
display_errors = Off
display_startup_error = Off
; 报告 Notice 以外的所有错误
error_reporting = E_ALL & ~E_NOTICE
log_errors = On
throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));
エラータイプが E_USER_DEPRECATED の場合、@
@trigger_error("foo", E_USER_DEPRECATED);