« pure-ftpdのカスタム認証ハンドラ | メイン | CGI::Application用(デバッグ)サーバ »

CGI::AppでのDebugScreen

CGI::AppでのDebugScreenがCPANにアップされました。
http://search.cpan.org/~nekokak/CGI-Application-Plugin-DebugScreen-0.01/
id:nekokakさんグッジョブです。

id:tokuhiromさんが指摘している

たぶんこれは期待した動作をしないハズです。
他のライブラリが eval-block とか使ってるケースがあるので。


これのシンプルな例をあげると、

my $denominator = $q->param('denominator') || 0;
my $ret = eval{10/$denominator} || 0;

このコードで $denominatorや$q->param('denominator')が0の場合、当然2行目のeval blockの中はIllegal division by zeroでdieします。この場合eval blockがundefを返すのでその動きを期待して、$retに0を代入できる。

この場合に

$SIG{__DIE__}=sub{
    #hogehoge
    print "error";
   #dieせず次へ
}

としてしまうとたぶん期待通り動かない。
エラー文章が画面に出力された上で、次が動く。dieしてもエラー文章は表示してしまう。

どうしたらいいのかと考えると、おなじくtokuhiromさんが書いているのを参考にするといいと思う。
CGI::Appでは$SIG{__DIE__}でstacktraceを$self->{___HOGEHOGE}にでも入れて(代入するかpushにするか)、別にinit callbackで設定した設定したerror_modeのページでそれを出力というのはどうでしょう。
ただしこの場合、prerunやpostrunでのdieは補足できないです。この辺りが12 things。

このあたりが修正できたら開発時には結構便利なプラグインだと思われです。