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 なんかで言うところの trycatch 構文みたいなこと、すなわち例外処理を行うために使用されることが多い。

$@ に書き出されるエラーの内容とは、本来であればコンソール上に出力されるか、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 モジュールでも (使えるんであれば) 使ってあげたほうがよっぽどスマートなんかな。