ホームページ  >  記事  >  バックエンド開発  >  PHP のエラーと例外を体系的に理解する

PHP のエラーと例外を体系的に理解する

藏色散人
藏色散人転載
2019-11-11 14:20:271821ブラウズ

PHP 言語がシンプルである理由の 1 つは、PHP のエラー処理メカニズムです。PHP 言語がますます最新のものになるにつれて、例外も発生します。このブログ投稿では、理解を容易にするためにエラーと例外についてのみ説明します。さらに、どの言語でも例外の存在は一般的であるため、言語を学習し、例外メカニズムを理解することが不可欠です。

#When 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 には多くのタイプの例外が用意されており、拡張することもできます

##● 例外に対する最も一般的なアクションは例外をキャッチすることです。このようにして、開発者は次の例外に基づいて後続の処理を実行できます。特定のエラー。たとえば、例外のコンテキストに基づいてユーザーにわかりやすいプロンプトを返すことができます。または、引き続き例外をスローし、上流のプログラムに処理させます。それでも例外が捕捉されない場合、プログラムは直接終了します。

# 例外に対するもう 1 つのアクションは、スローです。関数を使用してビジネス ロジックを作成し、予期しない状況が発生した場合は、直接例外をスローできます。##● 例外はコードによってスローできます。レイヤーごとに、最も外側のプログラムが例外をキャッチできなかった場合、コードの実行は直接終了します#● 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 &#39;Caught Exception: &#39;, $e->getMessage(), "\n";
    throw $e;
}

例外のベスト プラクティス

● 例外によりコードが明確になり、開発者はビジネス ロジックの作成に集中できるようになります。

● 拡張可能な例外の構築は非常に技術的です。SPL 例外では十分ではありませんか?

##● 例外のキャッチでは、この層で処理できる例外のみをキャプチャする必要があります。処理できない例外については、処理された例外は、アップストリームのコードによって処理されます。

PHP7 の例外

PHP7 では、例外を使用してエラーを置き換えることが推奨されていますが、エラー処理メカニズムを覆すことは不可能です互換性が必要なので、ゆっくりとしか移行できません。

ただし、例外は柔軟な方法で均一に使用できます。

● エラー例外

PHP で定義されているエラー例外が発生しました。この例外と例外が並置されていることに注意してください。

厳密モー​​ドがオンになっていると、PHP7 の多くのエラーがエラー例外によってスローされます。このようにして、例外は

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 中国語 Web サイトの他の関連記事を参照してください。

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