ホームページ  >  記事  >  バックエンド開発  >  PHP エラー処理を分析する (コア機能)

PHP エラー処理を分析する (コア機能)

藏色散人
藏色散人転載
2020-01-26 13:35:402108ブラウズ

PHP エラー処理を分析する (コア機能)

#エラーと例外

エラーは、構文エラーなど、プログラム自体のエラーを理解できます。例外は、プログラムが期待どおりに動作しない場合や、通常の処理に従わない場合に発生しやすく、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.

解析エラー または 構文エラー - 構文解析エラー。このエラーが発生した後、スクリプトは実行できませんまったく;

2.

致命的エラー - 致命的なエラー。このエラーが発生すると、後続のスクリプトは実行を続行できません;

3.

警告エラー - 不適切な場所が表示されます。スクリプトは実行を続行できます。

4.

Notice Error - 不適切な問題が発生しましたが、程度は警告エラーより低いため、スクリプトは実行を続行できます。実行を継続します;

5.

非推奨のエラー - この使用は推奨されず、将来放棄される可能性があります。スクリプトは実行を継続できます;

デフォルトでは、 PHP はエラーをトリガーし、エラー レベルと対応するプロンプトを表示します。

解析エラー 例 - ステートメントの最後にセミコロンがありません

 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_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING

 set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

Example

<?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

運用環境の推奨構成環境

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));

エラーの種類が

E_USER_DEPRECATED# の場合##、追加する必要があります
@

@trigger_error("foo", E_USER_DEPRECATED);関連する php の知識については、こちらをご覧ください。 phpチュートリアル

!

以上がPHP エラー処理を分析する (コア機能)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。