ホームページ >バックエンド開発 >PHP7 >PHP7のエラーと例外をまとめて分析する

PHP7のエラーと例外をまとめて分析する

藏色散人
藏色散人転載
2021-10-14 16:44:512254ブラウズ

推奨: 「PHP7 チュートリアル

PHP 言語が優れている理由シンプル そのうちの 1 つは、PHP のエラー処理メカニズムです。PHP 言語がますます現代的になるにつれて、例外も表示されます。このブログ投稿では、システムの理解を容易にするために、エラーと例外について簡単に説明します。また、どの言語でも、例外には共通点があります。

エラーとは
PHP 言語で異常な状況 (データベース接続 (または関数など) が発生したとき)パラメータが正しく渡されない場合)、いくつかのエラーが報告されます。エラーは多くの種類に分類できます。E_ERROR エラーと E_CORE_ERROR エラーを除き、他のエラーはプログラムを終了しません。
PHP が人々を単純だと感じさせる理由は、プログラムが頻繁にエラーを報告しないため、スムーズで便利な記述であるという錯覚を人々に与えます。
PHP プログラムの厳密性と正確性がはるかに悪いのはまさにこの理由です。たとえば、mysql_fetch_array クエリがネットワーク エラーに遭遇し、返された場合などです。 FALSE (プログラムの実行は終了しません)、呼び出し側プログラムがクエリに一致するデータがないと判断した場合、そのプログラムは本質的に間違っています。
php.ini の error_reporting 命令を通じて、どのタイプのエラーを報告するかを選択できます。または、error_reporting() 関数を動的に呼び出します。display_errors コマンドは、エラーをオンラインで出力するかどうかを制御できます。error_log コマンドは、ログへのエラー出力を制御できます。

#エラーを正しく使用する方法システム関数かカスタム関数か 関数が内部でエラーに遭遇した場合、呼び出し元にどのように通知しますか? これは通常、関数が TRUE または FALSE を返すことによって示されます。この処理方法にはいくつかの欠点があります:
#呼び出し元はエラーが発生したことしか知りませんが、返されるエラー情報が少なすぎ、エラーの種類の説明が不足しています。
# プログラムの処理ロジックとエラー処理が混在しており、生成されるコードは非常にわかりにくくなります。
ちょっとしたトリック: error_get_last() 関数は最新のエラーを返します。具体的な理由。

ベスト プラクティス:● すべてのエラーをホストする set_error_handler() 関数
#trigger_error() 関数はカスタム エラーをトリガーし、使用できます。関数内の return ステートメントを置き換えます。
# すべてのエラーをログに出力し、エラー タイプを定義します。
# 次のようなエラーをユーザーに表示します。よりわかりやすい方法でユーザーにエラーを返す
# 実稼働環境では、display_errors コマンドをオフにし、開発環境ではオンにする必要があります。
古い PHP フレームワーク Codeigniter は、エラーの処理方法から学ぶことができます

`function _error_handler($severity, $message, $filepath, $line)
{
    $is_error = (((E_ERROR | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR) & $severity) === $severity);
    //输出500错误HTTP状态码
    if ($is_error) {
        set_status_header(500);
    }
    //对于不需要处理的错误则直接中断
    if (($severity & error_reporting()) !== $severity) {
        return;
    }
    //将所有的错误记录到日志中
    $_error =& load_class('Exceptions', 'core');
    $_error->log_exception($severity, $message, $filepath, $line);
    //友好的输出所有错误
    if (str_ireplace(array('off', 'none', 'no', 'false', 'null'), '', ini_get('display_errors'))){
        $_error->show_php_error($severity, $message, $filepath, $line);
    }
    //假如致命错误则直接退出
    if ($is_error) {
        exit(1);   
    }
}
set_error_handler('_error_handler');`

例外とは例外はエラーでもあり、次の特徴があります:
● 例外はカスタマイズ可能であり、SPL は多くの種類の例外を提供します。 extend it
# 例外に対する最も一般的なアクションは、開発者が特定のエラーに基づいて例外をカスタマイズできるようにキャプチャすることです。その後の処理を実行します。たとえば、次のコンテキストに基づいてユーザーにわかりやすいプロンプトを返すことができます。または、例外をスローし続けて、上流のプログラムに処理させます。それでも例外がキャッチされない場合、プログラムは直接終了します。
# 追加の例外 最初のアクションはスローです。ビジネス ロジックを作成する場合関数を使用して予期しない状況が発生した場合は、直接例外をスローできます。
# 例外はコード層ごとにキャッチできます。最外部のプログラムがまだキャッチしていない場合、コードは実行を直接終了します。
# PHP の例外はキャッチできません。致命的なエラーとしてシステム エラー ログに書き込まれます。
直観的なコードで説明:

`function inverse($x)
{
    if ($x < 10) {
        throw new Exception(&#39;x<10&#39;);
    } elseif ($x >= 10 and $x < 100) {
        throw new LogicException(&#39;x>=10 and x<100&#39;);
    }
    return $x;
}
try {
    echo inverse(2)."\n";
} catch (LogicException $e) {
    echo &#39;Caught LogicException: &#39;, $e->getMessage(), "\n";
} catch (Exception $e) {
    echo 'Caught Exception: ', $e->getMessage(), "\n";
    throw $e;
}`

例外のベスト プラクティス● 例外コードが明確になり、開発者はビジネス ロジックの作成に集中できるようになります。
# 拡張可能な例外の構築は非常に技術的です。SPL 例外だけでは十分ではありませんか?そうですか?
● 例外のキャッチでは、例外を取得できる例外のみをキャプチャする必要があります。この層によって処理され、処理できない例外は上流コードで処理されます。

PHP7 の例外PHP7 エラーを置き換えるために例外を使用することが推奨されますが、例外を使用することは不可能です。エラー処理メカニズムを一度に覆します。互換性が必要なので、ゆっくりとしか移行できません。
ただし、例外は回避策によって一律に使用できます。
● エラー例外
PHP で定義されています。この例外と Exception が併置されていることに注意してください。
strict モードがオンになっている場合、PHP7 の多くのエラーは Error 例外によってスローされます。これにより、例外を統一的に使用できます。

`declare (strict_types = 1);
function add(int $a, int $b)
{
    return $a + $b;
}
try {
    echo add("3", "4");
}
catch (TypeError $e) { //TypeError继承自Error
    echo $e->getMessage();
}`
● ErrorException

ErrorException は Exception を継承します。
set_error_handler() 関数を使用して、すべてのエラーを ErrorException に変換できます。このようにして、例外を楽しく使用できます。
上記は体系的な理解です。PHP におけるエラーと例外の詳細, ご参考になれば幸いです。
原文を読む: PHP におけるエラーと例外の体系的な理解

以上がPHP7のエラーと例外をまとめて分析するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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