Подтвердить что ты не робот

Как принудительно выставить стек для всех фатальных ошибок в Perl?

В Perl существует ли способ заставить все фатальные ошибки отображать обратную трассировку стека, например Carp::confess?

Я знаю, что вы можете сделать use warnings FATAL => 'all';, чтобы сделать предупреждения фатальными в текущей лексической области.

Кроме того, можно использовать $SIG{__WARN__} = sub { CORE::die(@_) };, чтобы сделать все предупреждения фатальными всюду (что не локализовало обработчик SIGWARN).

Есть ли чистый способ сделать это, или мне нужно настроить SIGDIE? И если я пишу обработчик SIGDIE, каков наилучший способ получить трассировку?

Идеальное решение будет работать со стандартными библиотеками тестирования, Test::More и друзьями.

Обновление: Марк Джонсон предлагает использовать обработчик SIGDIE для вызова Carp::confess. Он работает красиво. Здесь код:

use Carp;
$SIG{ __DIE__ } = sub { Carp::confess( @_ ) };
4b9b3361

Ответ 1

Установите обработчик SIGDIE, который вызывает Carp:: confess? Или просто настроить Carp:: исповедовать как обработчик для DIE?

Остерегайтесь стандартных gotchas, связанных с eval. Существует еще weirder gotcha относительно блоков BEGIN. Также обратите внимание на зловещее предупреждение в perlvar.

См. этот вопрос для получения дополнительной информации о генерации трассировок стека.

Ответ 2

См. также модуль " Carp:: Always", который превращает все штампы и предупреждает в вашем коде в stacktraces.