小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

想定外エラーはevalでキャッチ!

たとえば、PerlCGIプログラムを組んでいるとします。
ご存知のようにWeb系では想定外のエラーが頻発します。
しかし、ブラウザにはCGIエラーと出るだけで、何のエラーで、何ライン(プログラムソース)で発生したかが分かりません。


そんな時は、ソースをまるごとevalブロックにしてしまうのです。
すると、想定外エラーをキャッチすることができるのです。


また、想定外エラーメッセージは特殊変数『$@』へ入ります。
しかも、プログラムソースの何ラインで発生したかも入っていますよ!


つまり、何のエラーで、何ラインでエラーが起きたのかが分かるのです。

eval {
    # 本来のCGIの処理をここに書きます。
};
if ($@) {
    print "Content-type: text/html\n\n";
    print "<html><body><h1>想定外エラー($@)</h1></body></html>\n";
}

補足:

evalブロックは、ブロックだけど実行文でもあるので、閉じ中カッコのあとにセミコロンが必要です。
また、想定外エラーの時は、$@にエラー文字列がセットされるので真となり、エラーでない時は、未定義なので偽となります。

補足2:(以下はkitsさんから、またまた教えて頂きました。いつもありがとうございます!)

CGIで想定外エラー(致命的エラー)が出た時は、とりあえず、Webサーバーのエラーログを見るクセをつけるとなにかと吉です。IISよりApacheのエラーログの方がプログラマを幸せにしてくれますね。
また、上記のようにevalしなくとも、以下の一行を入れると同等の効果があるようです。

use CGI::Carp qw(fatalsToBrowser); 


本ブログの応援クリック も、よろしくお願い致します。