首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >perl Carp模块中的无限循环

perl Carp模块中的无限循环
EN

Stack Overflow用户
提问于 2011-11-01 09:00:38
回答 2查看 462关注 0票数 4

我们有一些捕获异常的代码,记录消息,然后调用Carp::longmess来获取堆栈跟踪。

因此,我们正在做的事情的简化视图是:

代码语言:javascript
复制
eval { <some SOAP::Lite stuff> };
if( my $err = $@ )
{
    logwrite( "Caught Error: $err" );
}

logwrite函数本质上是:

代码语言:javascript
复制
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";
}

但在日志中我看到:

代码语言:javascript
复制
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包是怎么回事?这种情况很少见,但在过去一个月左右的时间里已经发生了几次,我们每天都有数百个这样的作业在运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-01 10:50:49

我知道这并没有回答你的实际问题,但是。。。既然在这种情况下显然是$msg eq 'at line ',也许您应该通过在print ... Carp::longmess ...语句的末尾添加unless $msg eq 'at line '来绕过这个问题?(我的意思是,除非有人提出一个真正的解决方案。)

票数 0
EN

Stack Overflow用户

发布于 2011-11-01 13:47:47

您的代码适合我在Perlv5.10.1和Carp.pm版本1.11上运行。

但是,请注意,它所做的可能不是您所期望的:longmess生成的回溯将显示logwrite函数的调用位置,而不是eval中实际发生错误的位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7961462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档