try、throw、catch・・・その2
try{}catch(){}構文の研究中につき、理解できた範囲をメモ。
PHP5から使えるようになったJAVAライクなエラー処理だが、慣れない自分にとっては理解に苦しむ記述なので、自分でいろいろ試してみることにした。
こんなスクリプトを書いた。
class myException extends Exception
{
}
class myClass
{
function __construct()
{
print(‘1′);
print(‘2′);
throw(new myException(‘error’));
print(‘3′);
print(‘4′);
}
}
try{
$obj=new myClass;
}catch(myException $e){
exit();
}
まずExceptionというクラスを継承してmyExceptionという派生クラスを作った。別に特別な処理をしているわけではないけれど、いろいろ調べたかったので、まずは派生クラスを定義しておいた。
次に実際に例外を投げるクラスをつくった。このクラスのコンストラクタの中で、
throw(new myException(‘error’));
と単に例外を投げるように記述した(実際はif文とか使ってエラーが発生した場合に例外を投げることは言うまでもない)。
最後のところで実際にオブジェクトを生成する処理を書いてある。
これを自分なりに読んでいく。
throw(new myException(‘error’));
throw関数の引数は例外として生成したオブジェクトらしい。おそらくいろいろな例外をあらかじめ想定し、例外の種類に応じてそれぞれの例外派生クラスを引き当てるのだろう。この例外クラスの引数は文字列でないといけないっぽい。つまりエラーメッセージをセットするようなイメージだろうか。いちおうもうひとつ引数を取れるみたいで、そちらにはエラーコード(番号)をセットするような感じ。
エラーが発生(例外をthrow)すると、そのスクリプトは途中で中断され(上記で言えば関数内の処理が途中で中断され)、catch構文へ処理が遷移することになる。
catch(myException $e)
この構文の意味がなかなか理解できなかった。どうやらmyExceptionのところは事前に想定した例外のクラス名を割り当てる(のだと思う)。後ろの$eはというと、実はここは$abcでも$errorでも何でもよさそう。new myException(‘error’)で「作りっぱなし」かよ、と思えたオブジェクトはこの変数に代入されるようだ。
あとは$eを煮るなり焼くなりすればいい。
ちなみに、いくつもの例外を想定するわけだから、実際はこんな記述になるのだろうか。
try{
$obj=new myClass;
}catch(my1Exception $e){
exit();
}catch(my2Exception $e){
exit();
}catch(my3Exception $e){
exit();
}catch(Exception $e){
exit();
}
いろんなエラーを想定しておいて、どれに合致するか試してみて、それにも合致しないエラーが出てしまったら最後のデフォルトの例外クラスでキャッチ。
理解できたようなできていないような・・・。まだしっくりこない。