ホームページ >バックエンド開発 >PHPチュートリアル >phpmaster | 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>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エラーは、ハンドラーが登録される前にそれらのエラーが発生するため、ハンドラーが定義されています。 例外を使用した
handler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext)架空のgetDataFromservice()メソッドによって例外がスローされると、キャッチブロックに巻き込まれ、メッセージが表示されます。 getDataFromservice()が正常に実行されると、フローはキャッチブロックを通過し、スクリプトの残りの部分を継続します。スローされて捕獲されていない例外は、「無作法な例外」というメッセージとともにe_fatalエラーを生成します。 例外クラスは、下の表に示すように、問題の原因に関する情報にアクセスするための6つの異なる方法を提供します。
<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)
<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はサーバーのエラーログにエラーレポートを送信し、画面にエラーメッセージを表示します。この動作は、ユーザーに機密情報を明らかにすることができるため、ライブWebサイトには理想的ではありません。したがって、ライブWebサイトのデフォルトのエラー処理設定を変更することをお勧めします。
PHPは、致命的なエラー、警告、解析エラー、通知など、エラーをいくつかのタイプに分類します。致命的なエラーは、存在しない関数を呼び出したり、書くことができないファイルに書き込むなど、重大なエラーです。警告は、スクリプトの実行を続けることを可能にする非致命的なエラーです。解析エラーは、スクリプトに構文ミスがある場合に発生します。通知は、PHPがスクリプトの実行中に遭遇するマイナーなエラーまたは可能なエラーです。これらの機能により、カスタムエラー処理ルールと例外を定義できます。エラーを処理するカスタム関数を指定できます。これは、エラーのロギングやエラー通知の送信に役立ちます。
例外は、スクリプトの指示の通常のフローを破壊するスクリプトの実行中に発生するイベントです。例外がスローされると、PHPはスクリプトの実行を停止し、例外を処理するためのキャッチブロックを探し始めます。キャッチブロックが見つからない場合、PHPは致命的なエラーを表示し、スクリプトの実行を停止します。 Tryブロックには、例外をスローする可能性のあるコードが含まれています。 Catchブロックには、例外を処理するコードが含まれています。最後にブロックには、例外がスローされたかどうかに関係なく実行されるコードが含まれています。エラーはPHPエンジンによって処理され、エラー報告設定とカスタムエラーハンドラーを使用して制御できます。一方、例外はスクリプトによって処理され、try、catch、および最後にブロックを使用して制御できます。ただし、ライブWebサイトにはエラーレポートをオフにすることは、問題を特定して修正することを困難にする可能性があるため、推奨されません。 PHPで式に加えられた場合、その式によって生成される可能性のあるエラーメッセージは無視されます。
以上がphpmaster | PHPでのエラー処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。