Если предположить, что нет реального исключения, то есть код выполняется нормально без $SIG{__DIE__}
, то где-то внутри этого вызова метода, вероятно, используется eval BLOCK
для перехвата и восстановления после ошибки. Одна из нескольких проблем, связанных с использованием eval BLOCK
в качестве обработчика исключений, заключается в том, что он вызывает $SIG{__DIE__}
, хотя на самом деле не должен.
Чтобы избежать этого, убедитесь, что $ ^ S имеет значение false в вашем $SIG{__DIE__}
.
local $SIG{__DIE__} = sub {
return if $^S;
...your error catching code...
};
См. Perlvar для более подробной информации.
Кстати, вы можете узнать подробности исключения, которое вызывает это, напечатав @ _.
local $SIG{__DIE__} = sub {
print "SIGDIE caught @_";
};
Еще лучше, если вам действительно не нужен глобальный обработчик кубиков, используйте eval BLOCK
.
eval {
my $mech = WWW::Mechanize::GZip->new();
$mech->get( 'http://ammoseek.com/' );
1;
} or do {
die "WWW::Mechanize::GZip failed and said: $@";
};
И посмотрите на Try :: Tiny для лучшего обработчика исключений.