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

Как я могу заменить все "умереть с исповедью" в приложении Perl?

Я работаю в большом приложении Perl и хочу получать трассировки стека каждый раз, когда вызывается "die" . Я знаю о Carp module, но я бы предпочел не искать/не заменять каждый экземпляр "die" на "confess". Кроме того, я бы хотел, чтобы полные стековые следы ошибок в Perl-модулях или самом интерпретаторе Perl, и, очевидно, я не могу изменить их для использования Carp.

Итак, есть ли способ изменить функцию "die" во время выполнения, чтобы она вела себя как "признаться"? Или, есть ли интерпретатор Perl, который выкинет полные следы стека из "die" ?

4b9b3361

Ответ 1

Используйте Devel::SimpleTrace или Carp::Always и они будут делать то, о чем вы просите, без какой-либо тяжелой работы с вашей стороны. Они имеют глобальный эффект, что означает, что их можно легко добавить только для одного прогона в командной строке, например, -MDevel::SimpleTrace.

Ответ 2

Как насчет установки обработчика сигнала __DIE__? Что-то вроде

$SIG{__DIE__} = sub { Carp::confess @_ };

вверху вашего script? Подробнее см. perlvar% SIG.

Ответ 3

Обычно я хочу только заменить die на бит кода, поэтому я локализую обработчик __DIE__:

 {
 use Carp;
 local $SIG{__DIE__} = \&Carp::confess;

 ....
 }

В качестве инструмента разработки это может работать, но некоторые модули используют трюки с этим, чтобы заставить свои функции работать. Эти функции могут прерываться нечетными способами, когда вы переопределяете обработчик, которого они ожидали. Это не очень хорошая практика, но иногда это происходит.

Ответ 4

Модуль Error преобразует все объекты die в Error::Simple, которые содержат полный стек (конструктор анализирует "в файле... строка.." текст и создает трассировку стека). Вы можете использовать произвольный объект (обычно подклассифицированный из Error::Simple) для обработки ошибок с помощью $Error::ObjectifyCallback.

Это особенно удобно, если вы обычно обходите исключениями других типов, чтобы сигнализировать о других событиях, так как тогда вы просто добавляете обработчик для Error::Simple (или любого другого класса, который вы используете для ошибок), и выгружаете его stacktrace или выполнять специализированное ведение журнала в зависимости от типа ошибки.