古庄親方の上級試験コラム#038 言語リファレンス エラー

http://php.net/manual/ja/language.errors.php

目次

前書き

エラーの本来の意味合いは「あやまり」「失敗」で、プログラミングにおいては非常に多岐にわたる意味合いを持ちます。
ただ、エラーは「エラーが起きていることを把握する」「どんなエラーが起きているかを把握する」「なにが原因なのかを把握する」といった、エラーへの理解があって初めて修正ができます。
ここでは、修正の手前にある「エラーの理解」につながるための技術を学んでいきましょう。

エラーの基本

https://www.php.net/manual/ja/language.errors.basics.php
どのエラーを報告してどのエラーを無視するのかを決めるのが、php.ini の error_reporting ディレクティブ です。
あるいは、実行時に error_reporting() を呼んで設定することもできます。
error_reporting は、エラー出力レベルの定義になります。

開発中は常に error_reporting を E_ALL にしておくべきです。あるいは、フルbit立てる意味合いで -1 を指定してもよいでしょう。 -1 を指定すると、どんなバージョンであっても「あらゆるエラーを表示する」ようになります。E_ALLは、過去には「いくつかのエラーを表示しない」設定になっている時もありました(現在は「-1と同様に、すべてのエラーを表示する」ようになっています)。
一方で、本番環境においては、0が指定されることが多いでしょう。これは「どんなエラーも表示しない」設定になります。

error_reporting と併せて、display_errors ディレクティブの設定を忘れないようにしましょう。
このディレクティブを設定する関数はないので、ini_set() 関数を使って設定をします。
本番環境では、display_errors は ‘0’ または ‘Off’ といった設定になることが多いでしょう。これは「エラーを画面に出力しない」設定になります。
開発環境では、’1′ や ‘On’ といった設定が多いでしょう。これは「エラーを画面に出力する」設定になります。
コマンドラインで動かすPHPプログラムであれば、 ‘stderr’ という設定を見かけるかもしれません。この設定は「エラーを、stderrに出力する」設定になります。

また、set_error_handler() 関数を使って独自のエラーハンドリングを行うケースも少なからずあります。
シンプルな用途ですと「すべての補足可能なエラーを”例外を投げる”ようにする」といったものから、「エラー時に、用意したログへの出力を行う」など、いろいろな使われ方があります。

PHP7以降のエラー

https://www.php.net/manual/ja/language.errors.php7.php
PHP 7 以降、 Error 例外としてスローするようになりました。
Error クラスは Exception を継承していないため、「ErrorもExceptionもキャッチしたい」場合は、大本である Throwable インタフェースを型として指定するようにしましょう。
Errorクラスを継承したクラスは、様々な状況でthrowされます。
いくつかサンプルのコードを書いたので、確認をしてみるとよいでしょう。

このコラムに関連するコードはこちらになります
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/038.php

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次