Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Как получить трассировку стека в eval {} ?


Автор: Logo 28.3.2013, 13:14
Получить трассировку стека в eval

Как распечатать сообщение об ошибке в eval {} c трассировкой стека?

Код

eval {
  ...
};
if($@) {
  # print stack trace
}

Автор: DurRandir 28.3.2013, 15:10
Код

$SIG{__DIE__} = sub {
  my $level = 0;
  while (my @info = caller($level++)){
    #output info here
  }
};

eval{ .. };


Автор: Logo 28.3.2013, 15:36
А без глобального переопределения $SIG{__DIE__} никак? Ведь он уже может быть кем-то определен.

Автор: DurRandir 28.3.2013, 15:41
Нет. Если глобальный хэндлер в этом месте вызывать не надо - делать просто local $SIG{__DIE__}, если нужен - то нечто в духе

Код

my $prev_handler = $SIG{__DIE__};
local $SIG{__DIE__} = sub{
  my_handler();
  goto &$prev_handler if $prev_handler;
}

Автор: Pfailed 29.3.2013, 06:23
если в eval  свой код, то кидать исключения , которые умеют вывод трейса

Автор: Logo 31.3.2013, 23:25
В том-то и дело, что нужно ловить perl ошибки тоже. А $SIG{__DIE__} в принципе может переопределяется внутри. Жаль, что нет нормальных исключений.

Автор: Pilat66 4.5.2013, 08:23
А почему Carp не используете?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)