Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить трассировку стека в eval {} ? 
:(
    Опции темы
Logo
Дата 28.3.2013, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Получить трассировку стека в eval

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

Код

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

PM MAIL   Вверх
DurRandir
Дата 28.3.2013, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Код

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

eval{ .. };


PM   Вверх
Logo
Дата 28.3.2013, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



А без глобального переопределения $SIG{__DIE__} никак? Ведь он уже может быть кем-то определен.
PM MAIL   Вверх
DurRandir
Дата 28.3.2013, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



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

Код

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


Это сообщение отредактировал(а) DurRandir - 28.3.2013, 15:41
PM   Вверх
Pfailed
Дата 29.3.2013, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



если в eval  свой код, то кидать исключения , которые умеют вывод трейса


--------------------
PM MAIL   Вверх
Logo
Дата 31.3.2013, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



В том-то и дело, что нужно ловить perl ошибки тоже. А $SIG{__DIE__} в принципе может переопределяется внутри. Жаль, что нет нормальных исключений.
PM MAIL   Вверх
Pilat66
Дата 4.5.2013, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 27.1.2009

Репутация: 1
Всего: 1



А почему Carp не используете?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.