我遇到与Can't disable stack trace in Carp::croak() for some reason相同的问题。因为堆栈中的每个调用都被认为是“安全的”,所以croak()
每次都会打印出完整的堆栈跟踪。我想为某些电话禁用它。
以下是一个例子:
use Carp;
sub this_may_fail {
# Some code...
croak "This call failed!";
}
sub regular_code {
this_may_fail();
}
regular_code();
两个子例程都在同一个包中,因此this_may_fail
会自动标记为安全。有没有办法告诉Carp this_may_fail
应被视为不安全?
答案 0 :(得分:3)
regular_code
被this_may_fail
视为“安全”。检查基于命名空间,因此为了使其不安全,您可以将this_may_fail
放在不同的命名空间中。
或者写下自己的小黄鱼。
perl -e'
use Carp qw( );
sub untrusting_croak {
goto &Carp::croak if $Carp::Verbose;
my @caller = caller(1);
die(join("", @_)." at $caller[1] line $caller[2]\n");
}
sub f { untrusting_croak("!!!"); } # Line 9
f(); # Line 11
'
!!! at -e line 11
答案 1 :(得分:3)
不是特别漂亮,但是,而不是这个:
sub regular_code {
...;
my $result = this_may_fail(@args);
}
你可以用这个......
sub regular_code {
...;
my $result = do {
my $sub = \&this_may_fail;
package DUMMY; $sub->(@args)
};
}