例外をキャッチし、メッセージをログに記録してから、スタックトレースを取得するために呼び出すコードがいくつかありますCarp::longmess
。
したがって、私たちが行っていることの簡略化されたビューは次のとおりです。
eval { <some SOAP::Lite stuff> };
if( my $err = $@ )
{
logwrite( "Caught Error: $err" );
}
logwrite関数は基本的に次のとおりです。
sub logwrite($)
{
my $msg = $_[0];
my($pkg,$fil,$lin)=caller;
my $timestamp = POSIX::strftime(...);
print STDERR "$timestamp $fil/$lin $msg\n";
print STDERR "$timestamp $fil/$lin Stack trace:\n" . Carp::longmess . "\n";
}
しかし、私が見ているログには次のようなものがあります。
20111030 Module.pm/42 Caught Error: at line
Use of uninitialized value in caller at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 22.
Use of uninitialized value in string eq at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 91.
Use of uninitialized value in numeric lt (<) at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 200.
Use of uninitialized value in pattern match (m//) at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 55.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 55.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
...
そして、モジュールからの警告のシーケンスはCarp/Heavy.pm
、何度も何度も何度も繰り返され、logifleを吹き飛ばします。だから私たちは最終的にそれを殺します。これらの警告は、への呼び出しによってトリガーされているように見えますCarp::longmess
。ここで他に興味深いのは、$@
変数がちょうどのように見えることat
です。これはat
dieによって追加されたものですが、実際のエラーメッセージや行番号はありません。
誰かがこれを以前に見たことがありますか、またはCarp
パッケージで何が起こっているのか考えていますか?これはまれですが、過去1か月ほどで数回発生しており、毎日何百ものこれらのジョブが実行されています。