【问题标题】:How can I mark a call as "unsafe" with Carp?如何使用 Carp 将呼叫标记为“不安全”?
【发布时间】:2014-02-18 16:59:19
【问题描述】:

我遇到了与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 应该被认为是不安全的?

【问题讨论】:

  • 只有regular_code() 调用this_may_fail 吗?如果是这样,那么您可以使用常规的die
  • this_may_fail 被从几个不同的位置调用,我需要知道它是从哪里调用的,以便找出问题所在。

标签: perl carp


【解决方案1】:

this_may_fail 认为是“安全”的 regular_code。检查是基于命名空间的,因此为了使其不安全,您可以将 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

【讨论】:

  • 我最终将我的一些函数移动到了不同的命名空间。感谢您的回答。
【解决方案2】:

不是特别漂亮,但是,而不是这个:

sub regular_code {
   ...;
   my $result = this_may_fail(@args);
}

你可以用这个...

sub regular_code {
   ...;
   my $result = do {
      my $sub = \&this_may_fail;
      package DUMMY; $sub->(@args)
   };
}

【讨论】:

    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多