Как я могу пометить звонок как "небезопасный" с Карпом?
У меня та же проблема, что и в Не могу отключить трассировку стека в 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)
};
}