我们有一些代码,捕获异常并记录消息,然后调用
那个来自
有人以前见过这种情况吗?或者有任何关于
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
模块的警告序列一遍又一遍地重复,不断地吹出日志文件。所以我们最终将其杀掉。这些警告看起来像是由对 Carp::longmess
的调用触发的。这里另一个有趣的事情是 $@
变量似乎只是 at
。它是由 die 添加的 at
,但没有实际的错误消息或行号。有人以前见过这种情况吗?或者有任何关于
Carp
包正在发生什么的想法吗?这很罕见,但在过去的一个月左右已经发生了几次,而且我们每天都有数百个这样的任务在运行。
$@
不包含at
。它包含一个空字符串,或者可能是未定义的。这并不那么不寻常。Carp 无法获取文件名或行号的能力则更加奇怪。 - ikegamieval
。所以我猜在堆栈中可能会出现问题。不幸的是,它并不一致,就像我说的,数百次运行中只有一个。虽然对于这个数据集来说,是9个中的2个。 - Sodved