如何用Carp将呼叫标记为“不安全”?

时间:2014-02-18 16:59:20

标签: perl carp

我遇到与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应被视为不安全?

2 个答案:

答案 0 :(得分:3)

regular_codethis_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)
   };
}