PHPのエラーと例外処理のメモ。
エラーは下記のように分類できる。
<?php echo('test') // ;がない。Parse Error発生。スクリプトを中断。 echo '終了'; // ここは処理されない ?>
<?php echo(some()); // some関数を定義していない。Fatal Error発生。スクリプトを中断。 echo '終了'; // ここは処理されない。 ?>
<?php echo($some); // someという変数を宣言していない。ここでNoticeが発生。 echo '終了'; // Noticeはスクリプトを中断しない。ここも実行され終了と表示される。 ?>
display_errors はエラー出力の有無を設定する。
diaplay_errorsが1のときはエラーが出力される。出力するエラーレベルはerror_reporting関数で設定する。
» PHP: 実行時設定 – Manual
PHPはエラーに応じてレベルが設定されている。
» 定義済み定数 PHP: Manual
Apache設定ファイルhttpd.confなどPHP外部でエラーレベルを設定するときは定数の代わりにビットマスク値(Integer)を使う。ただしビットマップマスク値はPHPのバージョンにより変更されることがあるので定数を使えるときは定義済み定数を使う。
出力する PHP エラーの種類を設定する
error_reporting() 関数は、 error_reporting ディレクティブを 実行時に設定します。PHP には多くのエラーレベルがあり、 この関数によりスクリプトの持続時間(実行時間)のレベルが設定されます。
初期値はE_ALL & ~E_NOTICE。
Notice以外のすべてのエラーを表示する。
Noticeも含めすべてのエラーを表示する場合は
error_reporting(E_ALL)
<? ini_set('display_errors', 1); error_reporting(E_ALL); echo($some); # Notice echo '終了'; ?>
Notice: Undefined variable: some …と出力してから終了を出力。
エラーをハンドリングしたいときはset_error_handlerでユーザー定義ハンドラ(コールバック関数)を設定する。
<? ini_set('display_errors', 1); error_reporting(E_ALL); // エラーハンドラ function errorHandler($errno, $errstr, $errfile, $errline) { if($errno === E_NOTICE) { echo 'Notice(警告)'; } } // エラーハンドラ設定 set_error_handler('errorHandler'); echo($some); echo '終了'; ?>
上記の例ではNoticeが発生したときはユーザー定義ハンドラが実行(Notice(警告)と出力)されPHP標準のエラーハンドル(Notice: Undefined variable: some … )は出力されない。
コールバック関数が FALSE を返さない限り、error_types で指定した型のエラーでは PHP 標準のエラーハンドラが完全にバイパスされることに注意してください。error_reporting() の設定にかかわらず、どのような場合でも ユーザーが設定したエラーハンドラがコールされます。ただし、この場合でも ハンドラで error_reporting() のカレントの値を読み、 それにあわせて適切に動作させることは可能です。エラーを発生した命令の前に @ エラー制御演算子 が付加されている場合、この値は 0 となることには注意しましょう。
ユーザーハンドラ関数は、必要に応じて die() を コールする責任があることにも注意しましょう。エラーハンドラ関数が リターンした場合、スクリプトの実行は、エラーを発生した命令の次の命令に 継続されます。
PHP 5から例外処理が可能になった。例外処が実装されているときはtry~catch文で例外処理を行える。
PHPでは、PHP5になるまで例外という機能がなかったため、組み込み関数は基本的に例外をはかず、エラーを報告します
しかし、多くのPHP 5向けのライブラリやフレームワークでは例外は使われていますし、組み込みの拡張機能でもPDOなどの代表的なオブジェクトと試行の拡張機能で例外が使われるようになってきていまs。
例えばPDOはエラーハンドリングを3種類用意している。PDO::ERRMODE_EXCEPTIONを設定すれば例外を投げるようになり例外処理を利用できる。
» PHP: Errors and error handling – Manual;
» PHP: PDO::setAttribute – Manual
『パーフェクト PHP』技術評論社 (p160)にErrorExceptionでエラーを例外に変換する方法が掲載されている。
set_error_handler($function ($errno, $errstr, $errfile, $errline) { throw new ErrorException($errno, $errstr, $errfile, $errline); });
No comments yet.
改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。