The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Как в Perl перехватить __DIE__, чтобы это не отразилось на die() внутри eval
Если в скрипте используется свой обработчик $SIG{__DIE__}, то он отработает и
для die() внутри eval блока.

Чтобы этого не произошло, нужно вначале eval блока переключиться на старый обработчик:

eval { local $SIG{__DIE__}  = 'DEFAULT'; 
       local $SIG{__ALRM__} = sub { die 'timeout!' }; 
       alarm(1);
       ....
};

Простейший вариант, проверка $^S, устанавливается в 1 при вызове из eval блока:
local $SIG{'__DIE__'} = sub {
   die @_ if $^S;
   .....
}

Усложненный вариант:

sub _evalling { # Определение типа текущей подпрограммы
    my $i = 0; my $sub;
    while (defined($sub = (caller($i++))[3])){
        if ($sub =~ /^\(eval( \d+)?\)$/){
             return 1;
        }
    } 
    return 0;
}
$::SIG{'__DIE__'} = sub { # Перехват die()
    &{$self->{callback}}(@_ ? @_ : $@) unless _evalling;
    die @_;
};
 
27.04.2004 , Источник: http://groups.google.com/groups?hl=...
Ключи: perl, eval, die / Лицензия: CC-BY
Раздел:    Корень / Программисту и web-разработчику / Perl / Функции и модули в Perl

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Спонсоры:
Слёрм
Inferno Solutions
Hosting by Ihor
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2019 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру