Как получить трассировку стека в eval {} ?

 
0
 
Perl
ava
Logo | 28.03.2013, 14:14
Получить трассировку стека в eval

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


eval {
  ...
};
if($@) {
  # print stack trace
}
Kommentare (6)
ava
DurRandir | 28.03.2013, 15:10 #

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

eval{ .. };

ava
Logo | 28.03.2013, 15:36 #
А без глобального переопределения $SIG{__DIE__} никак? Ведь он уже может быть кем-то определен.
ava
DurRandir | 28.03.2013, 15:41 #
Нет. Если глобальный хэндлер в этом месте вызывать не надо - делать просто local $SIG{__DIE__}, если нужен - то нечто в духе


my $prev_handler = $SIG{__DIE__};
local $SIG{__DIE__} = sub{
  my_handler();
  goto &$prev_handler if $prev_handler;
}
ava
Pfailed | 29.03.2013, 06:23 #
если в eval  свой код, то кидать исключения , которые умеют вывод трейса
ava
Logo | 31.03.2013, 23:25 #
В том-то и дело, что нужно ловить perl ошибки тоже. А $SIG{__DIE__} в принципе может переопределяется внутри. Жаль, что нет нормальных исключений.
ava
Pilat66 | 04.05.2013, 08:23 #
А почему Carp не используете?
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden