Как я могу пометить звонок как "небезопасный" с Карпом?

У меня та же проблема, что и в Не могу отключить трассировку стека в Carp::croak() по некоторым причинам. Потому что каждый вызов в стеке считается "безопасным", croak() выводит полную трассировку стека каждый раз. Я хотел бы отключить это для определенных звонков.

Вот пример:

use Carp;

sub this_may_fail {
  # Some code...
  croak "This call failed!";
}

sub regular_code {
  this_may_fail();
}

regular_code();

Обе подпрограммы находятся в одном пакете, поэтому this_may_fail автоматически помечается как безопасный. Есть ли способ сказать Карпу, что this_may_fail следует считать небезопасным?

2 ответа

Решение

Это 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

Не особенно красиво, но вместо этого:

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

Вы могли бы использовать это...

sub regular_code {
   ...;
   my $result = do {
      my $sub = \&this_may_fail;
      package DUMMY; $sub->(@args)
   };
}
Другие вопросы по тегам