ホームページ  >  記事  >  バックエンド開発  >  PHP のコア機能 - エラー処理

PHP のコア機能 - エラー処理

PHPz
PHPz転載
2016-07-28 08:30:171146ブラウズ

エラーと例外

エラーは、構文エラーなど、プログラム自体のエラーを理解できます。例外は、プログラムが期待どおりに実行されない場合や、通常のプロセスに準拠していない場合に発生する傾向があります。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(&#39;customError&#39;, 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(&#39;错误消息为 %s&#39;, $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 コーディング仕様関連

例外およびエラーメッセージ文字列は、sprintf;

display_errors = Off
display_startup_error = Off
; 报告 Notice 以外的所有错误
error_reporting = E_ALL & ~E_NOTICE
log_errors = On
を使用して結合する必要があります

throw new CommandNotFoundException(sprintf(&#39;Command "%s" does not exist.&#39;, $name));

エラータイプが E_USER_DEPRECATED の場合、@

@trigger_error("foo", E_USER_DEPRECATED);
を追加する必要があります
声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。