Die&warn

自前でCGI::Carpのような物をワーニングレベルに応じて出すモジュールを作ろうと思って調べてみた。

まず、ワーニングレベルを調べるには$^Wを調べればいいようだ。
-w 又は -Wをつけて起動した場合にはここに値が挿入される。*1

そして問題のワーニングメッセージとダイメッセージ。
$SIG{__WARN__}
$SIG{__DIE__}
この二つのハッシュに関数を結びつければ第一引数としてエラーメッセージを引っ張ってこれるようだ。

さて、実際問題として業務に使う場合にエラーやワーニングが出るのは問題外と言いたいところだがそれでもバグが出る場合は往々にして存在する。
そんなときにエラーメッセージが画面に出るだけの味気ないエラーメッセージでは間違いなくクライアントに怒られる:-P
だが、デバッグ中にはそのエラーの情報を見る必要が出てくるわけだ。

そのための情報を$^Wで判断して以下のように区別する。

作成中の時はワーニング情報もエラーとしてキャッチし、エラーメッセージが存在した場合にはそれを表示する。
致命的なエラー。つまりプログラムが終了するようなエラーは問題外。
確実にエラーメッセージを保持し、それを表示する。

そして、リリースバージョンの、つまり$^Wが0の場合は以下のようなルールになる。

予め保持しておいたテンプレートを表示する。
エラーメッセージを埋め込むかどうかはPGに任せる。

私個人としてはソースに表示するのも止めた方が良いのではないかと思うんですよね。
攻撃者がそのエラーコードからエラーの内容を理解し、攻撃に利用しないとは言い切れないわけですから。
こんな感じに出来ないかなと。

ただ、この方法には問題があってそれに今悩んでいます。
それは上にもあるようにエラーメッセージが第一引数に入ること。
つまりモジュールを作成した際に初期化した値を読み出すことが出来ないのではないかと。

まぁ、方法は何個か有るので何とかなるでしょう。多分。

*1:Perl5.8では1が入る。