4

例外をキャッチし、メッセージをログに記録してから、スタックトレースを取得するために呼び出すコードがいくつかあります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です。これはatdieによって追加されたものですが、実際のエラーメッセージや行番号はありません。

誰かがこれを以前に見たことがありますか、またはCarpパッケージで何が起こっているのか考えていますか?これはまれですが、過去1か月ほどで数回発生しており、毎日何百ものこれらのジョブが実行されています。

4

2 に答える 2

1

Carp.pmあなたのコードはバージョン1.11のperlv5.10.1で動作します。

ただし、それが行うことはおそらく期待したものではないことに注意してください。によって生成されるバックトレースは、実際のエラーが内部で発生した場所ではなくlongmess、関数が呼び出された場所を示します。logwriteeval

于 2011-11-01T05:47:47.457 に答える
0

これはあなたの実際の質問に答えるものではないことを私は理解していますが。。。どうやらこの場合、ステートメントの最後に$msg eq 'at line 'タックすることで問題を回避する必要があるのではないでしょうか。(つまり、誰かが実際の解決策を提案しない限り。)unless $msg eq 'at line 'print ... Carp::longmess ...

于 2011-11-01T02:50:48.643 に答える