Пропустить самый верхний вызывающий для обработчика ошибок, используя confess / croak / cluck? - PullRequest
1 голос
/ 02 марта 2020

Я написал свой собственный обработчик исключений, используемый как catch2 { some_code } [optional params]. Это работает, вызывая confess, когда исключение не обрабатывается. Для простоты я положил его прямо в пакет, где это необходимо. Тем не менее, верхние фреймы вызовов включают мой catch2 sub.

Как я могу опустить это простым способом?

Мне кажется, что ни один из них не может помочь, поскольку они ссылаются на пакеты, не сабы каждый:

@CARP_NOT
%Carp::Internal
%Carp::CarpInternal

$Carp::CarpLevel=1, кажется, делает свое дело, но документы говорят, что это не должно использоваться (perl 5.18.2).

1 Ответ

2 голосов
/ 02 апреля 2020

Чтобы пропустить кадры вызова из модуля, где реализована обработка исключений, используйте:

use Carp;
$Carp::Internal{(__PACKAGE__)} = 1;

Возможно, вас заинтересует Perl ошибка "# 132281: улучшить документацию по% Carp :: Internal" Тоже.

Для моего экспериментального пакета обработки исключений ExES, реализуемого в ExES.pl вместе с некоторым тестовым кодом (в пакете main), разница такая:

Сообщение по умолчанию :

catch(): Illegal division by zero at ExES.pl line 78.
 at ExES.pl line 36.
    ExES::catch(CODE(0x558a56b9cdb8), undef) called at ExES.pl line 48
    ExES::catch2(CODE(0x558a56b9cdb8)) called at ExES.pl line 78

При примененном решении получается:

catch(): Illegal division by zero at ExES.pl line 78.
 at ExES.pl line 78.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...