Как заставить стек возвращать все фатальные ошибки в Perl? - PullRequest
24 голосов
/ 10 апреля 2009

В 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( @_ ) };

Ответы [ 2 ]

16 голосов
/ 10 апреля 2009

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

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

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

11 голосов
/ 11 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...