Как принудительно выставить стек для всех фатальных ошибок в 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( @_ ) };
Ответы
Ответ 1
Установите обработчик SIGDIE, который вызывает Carp:: confess? Или просто настроить Carp:: исповедовать как обработчик для DIE?
Остерегайтесь стандартных gotchas, связанных с eval. Существует еще weirder gotcha относительно блоков BEGIN. Также обратите внимание на зловещее предупреждение в perlvar.
См. этот вопрос для получения дополнительной информации о генерации трассировок стека.
Ответ 2
См. также модуль " Carp:: Always", который превращает все штампы и предупреждает в вашем коде в stacktraces.