Как в 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 @_;
};
|
|
|
|
Раздел: Корень / Программисту и web-разработчику / Perl / Функции и модули в Perl |