カテゴリー:
制御構造
閲覧数:2293 配信日:2010-05-22 10:16
ネスト
PHP5.3以降では、例外をネストさせることができる
・「例外」を投げたレベルでキャッチされなかった場合には、キャッチされるまで、上位レベルを探し続けていく
class Ex1 extends Exception{}
class Ex2 extends Exception{}
try{//①
try{//②
try{//③
echo "Ex1 例外を投げる \n";//④
throw new Ex1;//同レベルでは捕捉できない
}catch(Ex2 $e){} //上位レベルを探していく
}catch(Exception $e){//⑤ここで捕捉
echo get_class($e), " 例外をキャッチ \n\n";
echo "Ex2 例外を投げる \n";
throw new Ex2;
}
}catch(Exception $e){
echo get_class($e), " 例外をキャッチ \n\n";
echo "ここで更に Ex2 例外を投げると、既に最上位レベルなのでキャッチされず、エラーとなる \n";
//throw new Ex2;//Fatal error: Uncaught exception 'Ex2'。
}
・結果
Ex1 例外を投げる
Ex1 例外をキャッチ
Ex2 例外を投げる
Ex2 例外をキャッチ
ここで更に Ex2 例外を投げると、既に最上位レベルなのでキャッチされず、エラーとなる
Ex1 例外をキャッチ
Ex2 例外を投げる
Ex2 例外をキャッチ
ここで更に Ex2 例外を投げると、既に最上位レベルなのでキャッチされず、エラーとなる
・例外クラス名でExceptionを指定した箇所で、「Exceptionを継承して定義されたオブジェクト」を捕捉
class FooException extends Exception//Exceptionクラスを継承
{
public function __construct($message, $code = 0, Exception $previous = null)//2.コンストラクタ実行
{
parent::__construct($message, $code, $previous);//3.親クラスコンストラクタ実行
}
}
try {
try {
throw new FooException('FooException');//1.「Exceptionクラスを継承したFooExceptionクラス」のインスタンスオブジェクトを生成
} catch (FooException $e) {//4.FooExceptionクラスの例外を補足
echo 'FooException', PHP_EOL;//5.
throw $e;//6.発生したFooExceptionクラスの例外をのままthrow
}
} catch (Exception $e) {//7.例外クラス名でExceptionを指定しているのに、発生したFooExceptionを捕捉できている。PHPでは、Exceptionはすべての例外のスーパークラスなので、Exceptionを継承して定義されたオブジェクトも捕捉できるため
echo 'Exception', PHP_EOL;
}
// 出力:
//FooException
//Exception