by Hippo2000(2000/8/10)
CGI::Carpモジュールなのです。
原本の著作権はLincoln D. Stein.氏がお持ちです。詳しくは著作権情報をご覧ください。
内容等が間違っていたら修正します。ご連絡ください。
CGI::Carp - HTTPD(またはその他)にエラーログを書込むためのCGIルーチン
use CGI::Carp;
croak "We're outta here!";
confess "It was my fault: $!";
carp "It was your fault!";
warn "I'm confused";
die "I'm dying.\n";
use CGI::Carp qw(cluck);
cluck "I wouldn't do that if I were you";
use CGI::Carp qw(fatalsToBrowser);
die "Fatal error messages are now sent to browser";
CGIスクリプトはタイムスタンプもされず完全に識別もされないエラーログに警告メッセージを残すという厄介な習性を持っています。エラーをおこしたスクリプトを追いかけるのは大変です。これを修正するために通常の
use Carp;
を、これで
use CGI::Carp
置き換えてください。
すると標準のwarn()、die()、croak()、confess()そしてcarp()が自動的に、きれいにタイムスタンプがついたメッセージをHTTPサーバーエラーログに出力します。
例:
[Fri Nov 17 21:40:43 1995] test.pl: I'm confused at test.pl line 3. [Fri Nov 17 21:40:43 1995] test.pl: Got an error message: Permission denied. [Fri Nov 17 21:40:43 1995] test.pl: I'm dying.
デフォルトではエラーメッセージはSTDERRに送られます。ほとんどのHTTPDサーバはSTDERRをサーバのエラーログに導きます。いくつかのアプリケーションは、サーバのエラーログとは区別して、プライベートなエラーログを保持したいと思うかもしれません。あるいはブラウザがそれをうけとるようにSTDOUTにエラーメッセージを導きたいかもしれません。
carpout()関数はこの目的のために提供されています。carpout()はデフォルトではエクポートされないので、以下のように明示的にインポートしなければいけません:
use CGI::Carp qw(carpout);
carpout()関数は1つの引数を必要とします。エラーを出力したい、オープンされているファイルハンドルへのリファレンスでなければなりません。コンパイラー・エラーも捕まえるように、CGIアプリケーションの一番上でBEGINブロックで呼ばれなければなりません。例:
BEGIN {
use CGI::Carp qw(carpout);
open(LOG, ">>/usr/local/cgi-logs/mycgi-log") or
die("Unable to open mycgi-log: $!\n");
carpout(LOG);
}
carpout()は現時点では、あなたに代わってログに対するファイルのロックを扱うことはしません。
本当のSTDERRはクローズされません--それはSAVEERRに移ります。CGIスクリプトを取り扱うとき、いくつかのサーバではスクリプトがSTDOUTとSTDERRを閉じるとブラウザへの接続をクローズします。SAVEERRは時期尚早なハプニングからこれを防ぐために使われます。
いろいろな方法でcarpout()にファイルハンドルを渡すことができます。Tom Christiansen によると"正しい"方法はファイルハンドルGLOBへのリファレンスを渡すことです:
carpout(\*LOG);
これは奇妙に単なる死にぞこないのように見えます、しかしながらそこで以下の書き方も受け取ります:
carpout(LOG);
carpout(main::LOG);
carpout(main'LOG);
carpout(\LOG);
carpout(\'main::LOG');
... などなど
FileHandle や他のオブジェクトもうまく動きます。
carpout()の使い方はパフォーマンス的にはよくありせん。そのためデバッグ目的あるいは中程度で使用されるアプリケーションにお勧めします。このモジュールの将来では、パフォーマンスへの影響を押さえるため、STDERRへのリダイレクトをCGI::Carpメソッドのいずれかが呼ばれるまで遅らせるかもしれません。
致命的な(die、confess)エラーをブラウザに送りたければ、特別な"fatalsToBrowser"サブルーチンをインポートします:
use CGI::Carp qw(fatalsToBrowser);
die "Bad error here";
致命的なエラーは、初期のコンパイルエラーで発生したエラーであっても見られるように最小限のHTTPヘッダをブラウザに送るようにCGI::Carpでアレンジされて、ブラウザにエコーされます。(carpoutによりリダイレクトされていなければ)致命的でないエラーはまだログファイルにだけ導かれます。
デフォルトでは、ソフトウェア・エラーメッセージにはエラーの時刻と日付とともにWebmasterにe-mailでコンタクストするような注意書きがつきます。このメッセージがお気に召さなければ、set_message()ルーチンを使って変更することが出来ます。これはデフォルトではインポートされません;use()行でインポートしなければなりません:
use CGI::Carp qw(fatalsToBrowser set_message);
set_message("It's not a bug, it's a feature!");
カスタマイズしたエラーメッセージを作るために、コードリファレンスを渡すことも出来ます。実行時には、あなたのコードは、スクリプトを死なせた(die)エラー・メッセージのテキストで呼び出されます。例:
use CGI::Carp qw(fatalsToBrowser set_message);
BEGIN {
sub handle_errors {
my $msg = shift;
print "<h1>Oh gosh</h1>";
print "Got an error: $msg";
}
set_message(\&handle_errors);
}
正確にコンパイル時のエラーを捕まえるためには、set_message()はBEGIN{}ブロックの中から呼び出さなければいけません。
致命的でないエラーをHTMLコメントとしてあなたのプログラムの出力に埋め込むことも出来るようにまり増した.この機能を可能とするためには、新しい"warningsToBrowser"サブルーチンをエクスポートします。HTTPヘッダが送信される前にブラウザへ警告を送信するとエラーになるので、warninigsToBrowser()サブルーチンをtrueの引数で呼ぶまで、すべての警告は内部バッファに格納されます。
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use CGI qw(:standard);
print header();
warningsToBrowser(1);
HTMLコメントが許されない場所で内容を出力している間、ブラウザに警告が送られるのを防ぐためwarningsToBrowser()に引数falseを与えることも出来ます:
warningsToBrowser(0); # disable warnings
print "<SCRIPT type=javascript><!--\n";
print_some_javascript_code();
print "//--></SCRIPT>\n";
warningsToBrowser(1); # re-enable warnings
注意:この点でwarningsToBrowser()はfatalsToBrowser()とは根本的に違います、あなたは決してそれをあなた自身で呼ぶことはありません!!
1.05 carpout() added and minor corrections by
Marc Hedlund <hedlund@best.com>
on 11/26/95.
1.06 fatalsToBrowser() no longer aborts for fatal
errors within eval() statements.
1.08 set_message() added and carpout()
expanded to allow for FileHandle objects.
1.09 set_message() now allows users to pass a
code REFERENCE for really custom error messages. croak and carp
are now exported by default. Thanks to Gunther Birznieks for the
patches.
1.10 Patch from Chris Dean (ctdean@cogit.com) to allow module to run correctly under mod_perl.
1.11 Changed order of > and < escapes.
1.12 Changed die() on line 217 to CORE::die to
avoid -w warning.
1.13 Added cluck() to make the module orthogonal
with Carp. More mod_perl related fixes.
1.20 Patch from Ilmari Karonen (perl@itz.pp.sci.fi) Added warningsToBrowser().
Replaced <CODE> tags with <PRE> in fatalsToBrowser()
output.
(原文のまま)
Copyright 1995-1998, Lincoln D. Stein. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Address bug reports and comments to: lstein@cshl.org
Carp, CGI::Base, CGI::BasePlus, CGI::Request, CGI::MiniSvr, CGI::Form, CGI::Response
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。