CGIでも気軽にdie
evalで囲んだ中なら、dieやcroakなどの例外が発生したときに、それを捕まえられます。
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
[ ページ先頭へ ]