例外処理(Exception)

PHP5よりtry&catchによる例外処理(Exception)を使うことができるようになりました。

エラーが出たとき、PHPではそこで処理が停止していましたが、例外処理を導入することで エラーが起きても処理を続けることができるようになり、また開発者にとっては、『どこで』『どんな』エラーが出たのかがわかりやすくなります。

どれだけ完璧なプログラムを組んでいたとしても、たとえばSQLサーバがとまっているとか、必要なモジュールが組み込まれていないなどで 処理を続行できない場合があります。
完璧なプログラムとは、そのような例外をうまく制御しているものということかもしれません。

例外処理によるエラー処理とは、プログラムの実装によるバグを受け取るものではなく、処理を続行できない想定される問題に対処するためのものです。

try&catchによる例外処理の構文は次のようになります。

try {
エラーを検知したい処理
}catch(Exception $e){
エラーが起こったときの処理
}

Exceptionは組み込み済みのクラスです。

メソッド説明
Exception::getMessage例外のメッセージを返します
Exception::getPrevious直前の例外を返します
Exception::getCode例外のエラーコードを返します
Exception::getFile例外の発生したファイルを返します
Exception::getLine例外の発生した行数を返します
Exception::getTrace例外が発生するまでにたどった経路を返します
Exception::getTraceAsStringgetTraceを文字列型で返します
Exception::__toString例外のフォーマットを定義します
Exception::__clone例外をコピーします

tryブロック内で強制的にExceptionを発生させるには

throw new exception('エラーメッセージ');

のようにします。

Exceptionクラスを継承したクラスを作成することで、受け取るExceptionを分けることができます。

たとえば次のようにします。

try {
エラーを検知したい処理
} catch (PDOException $e) {
  echo $e->getMessage();
} catch (Exception $e) {
  echo $e->getMessage();
}

Exceptionはすべての例外処理を受け取るので、PDOExceptionの前に書いてはいけません。

try {
エラーを検知したい処理
} catch (Exception $e) {
ここで全ての例外が処理される
} catch (PDOException $e) {
ここにはどんな例外も入りません。
}

try&catchを使わない場合は『 @(アットマーク)』によりエラーを出力せず、boolean型で判断するなどします。

よく見かけるのは次のような処理です。

if (!($fp = @fopen($file_path,"r"))) {
  echo "ファイルの取得に失敗しました。";
  exit;
}

ただしPHPの内部関数の多くは例外処理に対応していないので、 使用できるのは例外処理を実装した新しいオブジェクト指向の拡張モジュールのみになります。
例外処理に対応していない場合でもErrorExceptionを使えばエラーを例外に変換することができます。

関連記事

スポンサーリンク

switch文とif文の違い

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る