Perl で CGI 用プログラムにおいて die を使う方法 ― 2006年06月21日 21時20分49秒
なんで今までこの書き方に気づかなかったんだろう。。。_| ̄|○
eval { &main_route; }; $@ and &error_message($@); exit; sub main_route { # メインの処理 } sub error_message { # エラーメッセージを HTML 出力する処理 }
eval
はブロック内のコードを実行する命令で、ブロック内のコードが異常終了した場合 (die
で終了しようとした場合を含む) に、エラーの内容を特殊変数 $@
に書き出してくれるというもの。よーするに C++ や Java なんかで言うところの try
~ catch
構文みたいなこと、すなわち例外処理を行うために使用されることが多い。
$@
に書き出されるエラーの内容とは、本来であればコンソール上に出力されるか、CGI であれば HTTPD の設定で指定されたエラーログ (apache2 のデフォルトなら /var/log/apahe2/error_log
とか) に書き出されるエラーメッセージそのもの。なので、例えば上記の例で main_route
関数内にて、
open my $fin, "<$content" or die 'お探しのファイルを開くことができません。';
なんて書いた箇所で、ファイルを開くのに失敗してしまった場合、eval
は $@
に以下のような値を設定する。
お探しのファイルを開くことができません。 at /var/www/localhost/cgi-bin/sample.cgi line 24.
まともなオブジェクト指向プログラム言語であれば、例外時にどのようなオブジェクトでも飛ばすことができるし、オブジェクトの型に応じた例外処理を書き分けることもできる。Perl で同じようなことをする場合、エラーメッセージの書式を決めるとかしてあげる必要があるわけだけんども、そこまでせんでも素直に Error
モジュールでも (使えるんであれば) 使ってあげたほうがよっぽどスマートなんかな。
最近のコメント