カテゴリー:
制御構造
閲覧数:1181 配信日:2010-05-22 10:16
「try catch」複数
「try」後の「catch」は複数設置可能
・最初の「catch」から順に、「投げられた例外オブジェクトのクラス名」と「引数に指定したクラス名」がマッチするかチェックしていく
「投げたクラス」もしくは「親クラス」はキャッチ可能
・最初にマッチした所の「キャッチ」ブロック処理が実行される
・catch記述の順番次第で、どこでcatchするかが変わってくる
class Ex1 extends Exception{}
class Ex2 extends Exception{}
class Ex3 extends Ex1{}
class Ex4 extends Ex2{}
class NotEx{}
for($i = 0; $i < 6; $i++){
try{
switch($i){
case 0://①
echo "「親クラスException」の例外が投げられる<br>";
throw new Exception;
case 1://③
echo "「子クラスEx1」の例外が投げられる<br>";
throw new Ex1;
case 2://⑤
echo "「子クラスEx2」の例外が投げられる<br>";
throw new Ex2;
case 3://⑦
echo "「孫クラスEx3」の例外が投げられる<br>";
throw new Ex3;
case 4://⑨
echo "「孫クラスEx4」の例外が投げられる<br>";
throw new Ex4;
//case 5://⑪
// echo "- NotEx 例外が投げられました。<br>";
// throw new NotEx;
}
//※catch記述の順番次第で、どこでcatchするかは変わる
}catch(Ex1 $e){//④同クラスでキャッチ ⑧親(親)クラスでキャッチ
echo "Ex1で、例外をキャッチ<br>";
echo get_class($e), " was caught.<br><br>";
}catch(Exception $e){//②同クラスでキャッチ ⑥親(親)クラスでキャッチ ⑩親の親(親)クラスでキャッチ
echo "「親クラスException」で、例外をキャッチ<br>";
echo get_class($e), " was caught.<br><br>";
}catch(Ex2 $e){
echo "Ex2で、例外をキャッチ<br>";
echo get_class($e), " was caught.<br><br>";
// }catch(NotEx $e){//「Notクラス」は、「Exceptionクラス」と無関係なため、「例外」とみなされずに「ExFatal error: Exceptions must be valid objects derived from the Exception base class」となる。
// echo "NotExで、例外をキャッチ<br>";
// echo get_class($e), " was caught.<br><br>";
}
}
・結果
「親クラスException」の例外が投げられる
「親クラスException」で、例外をキャッチ
Exception was caught.
「子クラスEx1」の例外が投げられる
Ex1で、例外をキャッチ
Ex1 was caught.
「子クラスEx2」の例外が投げられる
「親クラスException」で、例外をキャッチ
Ex2 was caught.
「孫クラスEx3」の例外が投げられる
Ex1で、例外をキャッチ
Ex3 was caught.
「孫クラスEx4」の例外が投げられる
「親クラスException」で、例外をキャッチ
Ex4 was caught.
「親クラスException」で、例外をキャッチ
Exception was caught.
「子クラスEx1」の例外が投げられる
Ex1で、例外をキャッチ
Ex1 was caught.
「子クラスEx2」の例外が投げられる
「親クラスException」で、例外をキャッチ
Ex2 was caught.
「孫クラスEx3」の例外が投げられる
Ex1で、例外をキャッチ
Ex3 was caught.
「孫クラスEx4」の例外が投げられる
「親クラスException」で、例外をキャッチ
Ex4 was caught.