エラー処理と例外処理 : PHP

Pocket

PHPのエラーと例外処理のメモ。

エラー(Error)

エラーは下記のように分類できる。

  • 処理を中断するエラー
    • Parse Error(構文エラー)
    • Fatal Error(致命的なエラー)
  • 処理を中断しないエラー
    • Warning(警告)・Notice(注意)
Parse Errorの例
<?php
echo('test') // ;がない。Parse Error発生。スクリプトを中断。
echo '終了'; // ここは処理されない
?>
Fatal Errorの例
<?php
echo(some()); // some関数を定義していない。Fatal Error発生。スクリプトを中断。
echo '終了';   // ここは処理されない。
?>
Noticeの例
<?php
echo($some); // someという変数を宣言していない。ここでNoticeが発生。
echo '終了'; // Noticeはスクリプトを中断しない。ここも実行され終了と表示される。
?>

エラー制御(display_errors)

display_errors はエラー出力の有無を設定する。
diaplay_errorsが1のときはエラーが出力される。出力するエラーレベルはerror_reporting関数で設定する。
» PHP: 実行時設定 – Manual

エラーレベル

PHPはエラーに応じてレベルが設定されている。
» 定義済み定数 PHP: Manual

Apache設定ファイルhttpd.confなどPHP外部でエラーレベルを設定するときは定数の代わりにビットマスク値(Integer)を使う。ただしビットマップマスク値はPHPのバージョンにより変更されることがあるので定数を使えるときは定義済み定数を使う。

エラー処理(関数)

error_reporting

出力する PHP エラーの種類を設定する

error_reporting() 関数は、 error_reporting ディレクティブを 実行時に設定します。PHP には多くのエラーレベルがあり、 この関数によりスクリプトの持続時間(実行時間)のレベルが設定されます。

» PHP: 定義済み定数 – Manual

初期値はE_ALL & ~E_NOTICE。
Notice以外のすべてのエラーを表示する。

Noticeも含めすべてのエラーを表示する場合は

error_reporting(E_ALL)
display_errors/error_reporting設定例
<?
ini_set('display_errors', 1);
error_reporting(E_ALL);

echo($some); # Notice
echo '終了';
?>

Notice: Undefined variable: some …と出力してから終了を出力。

set_error_handler(エラーハンドラ)

エラーをハンドリングしたいときは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() を コールする責任があることにも注意しましょう。エラーハンドラ関数が リターンした場合、スクリプトの実行は、エラーを発生した命令の次の命令に 継続されます。

» set_error_handler

例外(Exception)

PHP 5から例外処理が可能になった。例外処が実装されているときはtry~catch文で例外処理を行える。

PHPでは、PHP5になるまで例外という機能がなかったため、組み込み関数は基本的に例外をはかず、エラーを報告します

しかし、多くのPHP 5向けのライブラリやフレームワークでは例外は使われていますし、組み込みの拡張機能でもPDOなどの代表的なオブジェクトと試行の拡張機能で例外が使われるようになってきていまs。

パーフェクトPHP (PERFECT SERIES 3)

例えばPDOはエラーハンドリングを3種類用意している。PDO::ERRMODE_EXCEPTIONを設定すれば例外を投げるようになり例外処理を利用できる。
» PHP: Errors and error handling – Manual;
» PHP: PDO::setAttribute – Manual

エラー(Error)を例外(Exception)へ変換

『パーフェクト PHP』技術評論社 (p160)にErrorExceptionでエラーを例外に変換する方法が掲載されている。

set_error_handler($function ($errno, $errstr, $errfile, $errline)
{
    throw new ErrorException($errno, $errstr, $errfile, $errline);
});

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。