
エラーは、プログラミング時に開発者が直面する最も一般的なイベントです。エラーは、構文、実行時間、または論理に分類できます。ステートメントの最後にセミコロンを欠いていることは、構文エラーの例です。サーバーがダウンしているときにデータベースに接続しようとすることは、実行時エラーの例です。変数に誤ったデータを提供することは、ロジックエラーの例です。コードのエラーの数を減らし、効果を軽減するために、Webアプリケーションでは適切なエラー処理が不可欠です。
この記事は、PHPエラー処理のクラッシュコースです。 PHPの組み込みエラーレポートレベル、およびカスタムエラーハンドラーと例外処理を備えたエラーを処理する方法について学びます。
キーテイクアウト
- PHPエラー処理は、Webアプリケーションの整合性と機能を維持するために重要です。スクリプトの実行中に発生する可能性のある問題を特定して修正し、エラーが発生したときに表示されるものを制御することでユーザーエクスペリエンスを改善するのに役立ちます。
PHPは、ログや表示など、エラー処理用のいくつかの組み込み関数を提供します。また、エラーハンドラーを登録して例外を使用して、エラー処理戦略をカスタマイズする柔軟性を提供します。
PHPでのカスタムエラー処理は、set_error_handler()およびset_exception_handler()関数を使用して達成できます。これにより、開発者はカスタムエラー処理ルールと例外を定義できます。これは、ログのログエラーやエラー通知の送信に役立ちます。
PHPの例外は、スクリプトの実行中に発生するイベントであり、命令の通常の流れを妨害します。 Try、Catch、および最後にブロックすることを使用して処理できます。例外がスローされたときにキャッチブロックが見つからない場合、PHPは致命的なエラーを表示し、スクリプトの実行を停止します。
-
PHPエラー報告レベル-
すべてのエラーと警告を記録する必要があります。エラーの重大度に基づいて、通知は他のシステム/チームに送信する必要があります。その重大度をより良く測定できるように、PHPはエラーの性質を記述するためにいくつかの組み込みのエラーレベルを提供します。各レベルは、整数値で表され、プログラマが使用できる名前の名前が付いています。以下の表は、公式のPHPドキュメントから撮影されており、さまざまなレベルの一部を示しています。
-
レベルは、ビットオペレーターと一緒にマスクして、PHPの構成からそれらを含めるか、減算することができます。たとえば、E_ALL | E_STRICTを有効にして、E_STRICT(5.4より前のPHPのバージョンで必要)を追加して、すべてのエラーと警告を有効にします。
PHPは、ログと表示エラーの表示に関連するいくつかの構成ディレクティブを提供します。それらの価値は、一般に、システムが開発環境にあるのか、生産環境にあるのかによって異なります。この表は、エラー関連の指示の一部を示しています。
構成ディレクティブは、php.iniで、Webサーバー構成ファイル(httpd.confまたは.htaccessファイル)で、またはini_set()関数を使用してスクリプトで実行時に設定できます。ディレクティブの詳細とそれらを設定する方法/場所については、ドキュメントをお読みください。
カスタムエラーハンドラーの作成
また、エンドユーザーに生のエラーを表示しないことも良い習慣です。表示されるエラーは、フレンドリーなカスタムエラーメッセージで抽象化する必要があります。 PHPは、エラーの表示と表示のための組み込み関数を提供するだけでなく、それらを上げるためにも提供します。 trigger_error()を使用して、特定のレベルのエラーを実用的にトリガーできます。たとえば、このコードは、$テストの値が1を超える場合、e_user_notice警告をトリガーします。
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
Trigger_Error()を使用したエラーのトリガーは、エラー処理インフラストラクチャを配置している場合に役立ち、PHPによって提起されたエラーと警告の両方の処理を統合できます。
重大度に基づいてデータベースに電子メールを送信したり、ロギングエラーをデータベースにロギングしたりするなどのカスタマイズされたエラー処理戦略を実装する場合は、set_error_handler()を使用してカスタムエラーハンドラーを定義する必要があります。この関数は、エラーが発生したときに呼び出されるコールバック関数または静的メソッド、およびオプションでエラーレベルは関数/メソッドを処理する2つの引数を受け入れます。コールバックの署名は次のとおりです。
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

カスタムエラーハンドラー関数を見てみましょう。以下の例は、データベーステーブルデータベースに遭遇するたびにエラーを記録します。
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
上記のスニペットは、次のことを行うエラーハンドラーを登録します。脂肪性のないエラーが発生すると、エラーを表示してファイルにログする代わりに、レコードがデータベースに挿入されます。致命的なエラーが発生すると、データベースに記録され、スクリプトを終了します。
ただし、カスタムエラーハンドラーには注意が必要です。エラーハンドラーは、PHPの標準エラー処理動作をバイパスするため、ハンドラー自体内で発生する可能性のあるエラーを処理できません。たとえば、データベースサーバーがダウンしている場合、上記の関数はログの記録に失敗します。また、エラーハンドラーは、e_core_errorやe_compile_errorなどの特定の内部エラーをキャッチできません。同じファイルのe_strictエラーは、ハンドラーが登録される前にそれらのエラーが発生するため、ハンドラーが定義されています。
例外を使用した
処理エラー
どんなにエラー処理フレームワークがありますが、実行時には常に問題が発生します。もちろん、これらのエラーがユーザーのブラウザに表示されたくありません。これは、例外処理が画像に入る場所です。例外を使用すると、エラーや例外的な状況を優雅に処理できます。
例外は、クラスのExcpetion(またはそのサブクラスのいずれか)によってPHPで表されます。それらはスローを使用して育てることができ、トライ/キャッチブロックを使用してキャッチすることができます。例外を拡張して、特定のエラーをトラップするためのカスタム例外タイプを作成できます。
例外をトリガーする可能性のあるコードはTryブロック内に配置され、例外を処理するコードはCatchブロック内に配置されます。次のスニペットを検討してください。
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
架空のgetDataFromservice()メソッドによって例外がスローされると、キャッチブロックに巻き込まれ、メッセージが表示されます。 getDataFromservice()が正常に実行されると、フローはキャッチブロックを通過し、スクリプトの残りの部分を継続します。スローされて捕獲されていない例外は、「無作法な例外」というメッセージとともにe_fatalエラーを生成します。
例外クラスは、下の表に示すように、問題の原因に関する情報にアクセスするための6つの異なる方法を提供します。

カスタム例外ハンドラーの作成
PHPでは、それが例外であるかのようにすべてのオブジェクトを投げることができますが、経験則として、例外はPHPの組み込み例外クラスを拡張する必要があります。オブジェクトのタイプに基づいて、例外を異なる方法で処理できます。カスタム例外処理は、ファイルでエラーメッセージを記録するなどの適切なアクションを実行し、呼び出しスタックなどを調べてエラーが発生した行の正確な詳細を提供します。この例をご覧ください。
<span><span><?php
</span></span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error('Value of $test must be 1 or less', E_USER_NOTICE);
</span></span><span><span>}</span></span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
上のコードは、2つの新しいカスタム例外タイプ、nameExceptionを定義しています
また、電子メールエクセプト。これは、異なるエラーを示すために使用できます。次に、Tryブロック内で、CODEは変数$ nameと$ emailに値が提供されているかどうかを確認します。どちらかが空の場合、適切な例外がスローを使用してスローされます。対応するキャッチブロックが実行され、エラーが処理されます。
例外の再投与
トライ/キャッチブロックをネストできます。例外をキャッチし、そのプロパティの一部を見て、それを再度投げて、親がそれを処理するようにしたい場合があります。これは、多くの場合、エラーの状態を確認し、致命的かどうかを判断するのに役立ちます。この例コードは、例外の再投与を示しています。
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
excaught例外ハンドラー
set_error_handler()を使用すると、実行時間エラーを処理する関数を指定できる方法と同様に、set_exception_handler()関数は、キャッチブロックにキャッチされずにコールスタックを完全に上げる例外を処理できます。たとえば、例外がスタックをすべて上に上げた場合、ログファイルにログインすることをお勧めします。以下の例に示すように、コールバック関数を作成し、set_exception_handler()に登録できます。
<span><span><?php
</span></span><span><span>function errorHandler($errno, $errstr, $errfile, $errline) {
</span></span><span> <span>static $db;
</span></span><span> <span>if (empty($db)) {
</span></span><span> <span>$db = new PDO(DSN, DBUSER, DBPASS);
</span></span><span> <span>}
</span></span><span>
</span><span> <span>$query = "INSERT INTO errorlog (severity, message, filename, lineno, time) VALUES (?, ?, ?, ?, NOW())";
</span></span><span> <span>$stmt = $db->prepare($query);
</span></span><span>
</span><span> <span>switch ($errno) {
</span></span><span> <span>case E_NOTICE:
</span></span><span> <span>case E_USER_NOTICE:
</span></span><span> <span>case E_DEPRECATED:
</span></span><span> <span>case E_USER_DEPRECATED:
</span></span><span> <span>case E_STRICT:
</span></span><span> <span>$stmt->execute(array("NOTICE", $errstr, $errfile, $errline));
</span></span><span> <span>break;
</span></span><span>
</span><span> <span>case E_WARNING:
</span></span><span> <span>case E_USER_WARNING:
</span></span><span> <span>$stmt->execute(array("WARNING", $errstr, $errfile, $errline));
</span></span><span> <span>break;
</span></span><span>
</span><span> <span>case E_ERROR:
</span></span><span> <span>case E_USER_ERROR:
</span></span><span> <span>$stmt->execute(array("FATAL", $errstr, $errfile, $errline));
</span></span><span> <span>exit("FATAL error <span><span>$errstr</span> at <span>$errfile</span>:<span>$errline</span>"</span>);
</span></span><span>
</span><span> <span>default:
</span></span><span> <span>exit("Unknown error at <span><span>$errfile</span>:<span>$errline</span>"</span>);
</span></span><span> <span>}
</span></span><span><span>}
</span></span><span>
</span><span><span>set_error_handler("errorHandler");
</span></span><span>
</span><span><span>$test = 5;
</span></span><span><span>if ($test > 1) {
</span></span><span> <span>trigger_error("Value of <span><span>$test</span> must be 1 or less"</span>, E_USER_NOTICE);
</span></span><span><span>}</span></span>
ログイン後にコピー
要約
PHPは、ロギングや表示など、エラー条件を処理するためのさまざまな組み込み関数を提供します。また、エラーハンドラーを登録して例外を使用して、エラー処理戦略をカスタマイズする柔軟性を提供します。エラーは人生の事実ですが、この記事で私が提示した情報が、より優雅にそれらを処理するのに役立つことを願っています。
Ilya Andriyanov / Shutterstock
経由の画像 php でのエラー処理に関するよくある質問(FAQ)
PHPでのエラー処理の重要性は何ですか?PHPでのエラー処理は、Webアプリケーションの整合性と機能を維持するために重要です。開発者は、スクリプトの実行中に発生する可能性のある問題を特定して修正するのに役立ちます。適切なエラー処理がなければ、小さな問題は、アプリケーションのクラッシュやユーザーに機密情報を公開するなど、重大な問題を引き起こす可能性があります。また、ユーザーエクスペリエンスが改善されます。これにより、開発者は、混乱するエラーメッセージを表示するのではなく、ユーザーがエラーが発生したときに見えるものを制御できるようになります。PHPはデフォルトでエラーをどのように処理しますか?
デフォルトでは、PHPはサーバーのエラーログにエラーレポートを送信し、画面にエラーメッセージを表示します。この動作は、ユーザーに機密情報を明らかにすることができるため、ライブWebサイトには理想的ではありません。したがって、ライブWebサイトのデフォルトのエラー処理設定を変更することをお勧めします。
PHPのさまざまなタイプのエラーは何ですか?
PHPは、致命的なエラー、警告、解析エラー、通知など、エラーをいくつかのタイプに分類します。致命的なエラーは、存在しない関数を呼び出したり、書くことができないファイルに書き込むなど、重大なエラーです。警告は、スクリプトの実行を続けることを可能にする非致命的なエラーです。解析エラーは、スクリプトに構文ミスがある場合に発生します。通知は、PHPがスクリプトの実行中に遭遇するマイナーなエラーまたは可能なエラーです。これらの機能により、カスタムエラー処理ルールと例外を定義できます。エラーを処理するカスタム関数を指定できます。これは、エラーのロギングやエラー通知の送信に役立ちます。
PHPの例外は何ですか?
例外は、スクリプトの指示の通常のフローを破壊するスクリプトの実行中に発生するイベントです。例外がスローされると、PHPはスクリプトの実行を停止し、例外を処理するためのキャッチブロックを探し始めます。キャッチブロックが見つからない場合、PHPは致命的なエラーを表示し、スクリプトの実行を停止します。 Tryブロックには、例外をスローする可能性のあるコードが含まれています。 Catchブロックには、例外を処理するコードが含まれています。最後にブロックには、例外がスローされたかどうかに関係なく実行されるコードが含まれています。エラーはPHPエンジンによって処理され、エラー報告設定とカスタムエラーハンドラーを使用して制御できます。一方、例外はスクリプトによって処理され、try、catch、および最後にブロックを使用して制御できます。ただし、ライブWebサイトにはエラーレポートをオフにすることは、問題を特定して修正することを困難にする可能性があるため、推奨されません。 PHPで式に加えられた場合、その式によって生成される可能性のあるエラーメッセージは無視されます。 PHPにエラーを記録するにはどうすればよいですか?PHPは、ERROR_LOG()関数を提供して、サーバーのエラーログまたは指定されたファイルにエラーメッセージを送信します。この機能は、エラーを追跡してデバッグを追跡するのに役立ちます。 PHP.iniファイルのLOG_ERRORSディレクティブを変更して、すべてのエラーをログにログするようにPHPを構成することもできます。
以上がphpmaster | PHPでのエラー処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。