HOME備忘帳

CGIでも気軽にdie

evalで囲んだ中なら、diecroakなどの例外が発生したときに、それを捕まえられます。 CGIでも気軽にエラーを出せて便利です。

サンプルコード

#!/usr/bin/perl
use strict;

eval {
    # トラップしたい処理
    die("コケました");
};

# エラーがあれば
if ($@) {
    # 例えば単純にブラウザに出力してみる
    print <<EOM;
Content-type: text/html

<html>
<head><title>error</title></head>
<body>
<h1>error</h1>
<p>$@</p>
</body>
EOM
}

exit;

特殊変数$@には、最後に実行したeval内で発生した例外エラーメッセージがセットされます。 エラーが発生しなかったときは、必ずundefがセットされるので、if ($@) { エラー処理 }が常套句。

変数$@が分かりづらいなら、use Englishを使うと$EVAL_ERRORという分かりやすい変数名を設定してくれます。Englishは標準モジュールなので、追加インストールなしで使える可能性大です。

#!/usr/bin/perl
use strict;
use English;

eval {
    die("コケました");
};

if ($EVAL_ERROR) {
    #エラー処理
}
exit;

お気づきかと思いますが、evalは命令文なので、末尾にセミコロン;が無いとコンパイルエラーです。
あと、当然ながら、エラー処理内で発生した例外は捕まえられません。あまり複雑な処理を入れないほうが無難かと。

テスト中、単にエラーをブラウザに表示するだけなら、CGI::CarpモジュールのfatalsToBlowserでも用が足りますね。
evalを使うメリットは、エラー画面の見栄えをいくらか良くしたり、内容によっては表示せずに済ませたり、管理者にエラーメールを送ったりなど、エラーに対して任意のコントロールができるあたりでしょうか。

最終更新日:2012/10/22

[ ページ先頭へ ]