2013年3月27日水曜日

PHP 例外処理

例外処理

PHP5から例外処理としてtry~catch構文が使えるようになりました。
PHP5.5以前はfinally句は使用できませんが、PHP5.5以降からはfinally句も指定できます。

PHP5.5以前
try {
    例外が発生するかもしれない処理;
} catch (発生するかもしれない例外の種類  変数名) {
    例外発生時の処理;
}
PHP5.5以降
try {
    例外が発生するかもしれない処理;
} catch (発生するかもしれない例外の種類  変数名) {
    例外発生時の処理;
} finally {
    例外が発生しても発生しなくても必ず行う処理。
}

例外を発生させるにはthrowキーワードを使います。
throw new ExceptionまたはExceptionのサブクラス(コンストラクタ引数);


使用例
<?php
//例外をThrowする
class MyClass {
    public function Method1() {
        $this->Method2();
    }
    
    private function Method2() {
        throw new Exception('例外が発生しました。');
    }
}

//例外をcatchする
$obj = new MyClass();
try {
    $obj->Method1();
} catch (Exception $e) {
    print($e->getMessage());
}
?>
実行結果


ExceptionクラスにはgetMessage()メソッドのほかにも以下のようなメソッドがあります。
getMessage例外メッセージ
getCode例外コード
getFile例外を発生したファイル名
getLine例外を発生した行数
getTraceバックトレース(配列)
getTraceAsStringバックトレース(文字列)


例外クラスを継承し独自の例外を作成する

Exceptionクラスまたはそのサブクラスを継承し独自の例外を作成することができます。
//独自例外クラス
class MyException extends Exception {}

//独自例外をThrowする
class MyClass {
    public function Method1() {
        $this->Method2();
    }
    
    private function Method2() {
        throw new MyException('例外が発生しました。');
    }
}

//独自例外をcatchする
$obj = new MyClass();
try {
    $obj->Method1();
} catch (MyException $e) {
    print($e->getMessage());
}


PHPにはExceptionのサブクラスとして以下のような例外が用意されています。
LogicExceptionは開発者が間違ったコードを実装したときに発生させる例外です。
たとえばあるメソッドは引数に数値を想定して作成しているのに、数値に変換できないような文字列が引数に指定されたときはLogicExceptionまたはそのサブクラスをthrowする。
RuntimeExceptionは実行時にしか発生しない例外で通常の例外です。
  • LogicException
    • BadFunctionCallException・・・未定義の関数をコールバックが参照したり、引数を指定しなかったりした場合にスローされる例外です。
      • BadMethodCallException・・・未定義のメソッドをコールバックが参照したり、引数を指定しなかったりした場合にスローされる例外です。
    • DomainException・・・定義したデータドメインに値が従わないときにスローされる例外です。
    • InvalidArgumentException・・・引数が期待値に一致しなかった場合にスローされる例外です。
    • LengthException・・・長さが無効な場合にスローされる例外です。
    • OutOfRangeException・・・無効なインデックスを要求した場合にスローされる例外です。
  • RuntimeException
    • OutOfBoundsException・・・値が有効なキーでなかった場合にスローされる例外です。
    • OverflowException・・・いっぱいになっているコンテナに要素を追加した場合にスローされる例外です。
    • RangeException・・・・プログラムの実行時に範囲エラーが発生したことを示すときにスローされる例外です。
    • UnderflowException・・・空のコンテナ上で無効な操作 (要素の削除など) を試みたときにスローされる例外です。
    • UnexpectedValueException・・・いくつかの値のセットに一致しない値であった際にスローされる例外です。

0 件のコメント: