PHP入門:Errorsについて -vol.1-

スポンサーリンク
PHP入門:Errorsについて -vol.1- 用語解説
PHP入門:Errorsについて -vol.1-
この記事は約4分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、PHPのErrorsについてご紹介します。

スポンサーリンク

背景

PHP8.2を利用したAPIを開発しているときにErrorsを利用したので、そのときの調査内容を備忘としてのこしました。

こちらのサイトを参考にしています。

基本的な情報

PHPは、さまざまな内部エラー条件に対応してエラーを報告します。これらのエラーはさまざまな状況を示すために使用でき、必要に応じて表示および/またはログに記録できます。

PHPが生成するすべてのエラーにはエラーの種類が含まれます。これらのエラータイプのリストが利用可能であり、その動作や引き起こされる原因についての簡単な説明が提供されています。

PHPによるエラーの処理

エラーハンドラが設定されていない場合、PHPはその設定に従ってエラーを処理します。どのエラーが報告され、どのエラーが無視されるかは、php.ini ディレクティブである error_reporting または実行時に error_reporting() を呼び出すことによって制御されます。ただし、スクリプトの実行が開始する前にいくつかのエラーが発生する可能性があるため、ディレクティブの設定を推奨します。

開発環境では、PHPによって発生した問題に対処する必要があるため、常に error_reporting を E_ALL に設定するべきです。本番環境では、E_ALL & ~E_NOTICE & ~E_DEPRECATED のようなより冗長でないレベルに設定することも考えられますが、多くの場合、E_ALL も適切で、潜在的な問題の早期警告を提供できることがあります。

PHPはこれらのエラーに対して何を行うかは、さらに2つの php.ini ディレクティブに依存します。display_errors はエラーがスクリプトの出力の一部として表示されるかどうかを制御します。これは本番環境では常に無効にすべきであり、データベースのパスワードなどの機密情報が含まれる可能性があるためですが、開発時には問題の直ちの報告を確実にするために有用な場合があります。

エラーの表示に加えて、error_log ディレクティブが有効になっている場合、PHPはエラーをログに記録できます。これは本番環境で非常に有用であり、エラーが発生した場合にエラーを記録し、それらのエラーに基づいてレポートを生成できます。

ユーザー定義のエラーハンドラ

PHPのデフォルトのエラーハンドリングが不十分な場合、set_error_handler() を使用してカスタムエラーハンドラをインストールすることで、多くの種類のエラーを独自に処理できます。一部のエラータイプはこの方法では処理できないことがありますが、処理できるエラータイプは、スクリプトが必要とする方法で処理できます。たとえば、これを使用してユーザーにカスタムエラーページを表示し、ログを通じてではなく、メールでエラーをより直接報告することができます。

PHP 7におけるエラー

PHP 7では、PHP 5で使用されていた従来のエラー報告メカニズムを通じてエラーを報告する代わりに、ほとんどのエラーはError例外をスローすることで報告されるように変更されました。

通常の例外と同様に、これらのError例外は最初に一致するcatchブロックに到達するまでバブルアップします。一致するブロックが存在しない場合、set_exception_handler() でインストールされたデフォルトの例外ハンドラが呼び出され、デフォルトの例外ハンドラも存在しない場合、例外は致命的なエラーに変換され、従来のエラーと同様に処理されます。

Errorの階層はExceptionから継承していないため、PHP 5で未処理の例外を処理するために catch (Exception $e) { … } ブロックを使用していたコードでは、これらのErrorはこれらのブロックでキャッチされないことがあります。これらのErrorをキャッチするには、catch (Error $e) { … } ブロックまたはset_exception_handler() ハンドラが必要です。

おわりに

今日は、PHPのErrorsについてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました