Кажется, что некоторые из этих файлов действительно имеют ошибки формата.Затем вы можете отследить эти сбои и обработать неверные файлы (имена записей или удалить файлы и т. Д.) И в противном случае продолжить работу в обычном режиме.
Если отображаемая вами «ошибка» является исключением (программа умирает), то вы можетеловите и обрабатывайте это
eval { unzip($zipfile, $folder, $out) };
if ($@) {
say "Error: $@";
# Interrogate. (Is it the expected error or some other?)
# handle it: record the filename for later/delete it/etc ...
}
Встроенный способ обработки «исключений» в Perl - который просто die - это через (блочную форму) eval , † Также см. переменную ошибки $@
в perlvar .
Если ваше сообщение является простым предупреждением, а программа продолжается, то eval
не может перехватитьтот.Один из способов обнаружить это - установить SIG{__WARN__}
хук и в него добавить die
, и тогда тот же eval
, как указано выше, будет работать
# Block, so the change to how warnings work is scoped as tight as possible
HANDLE_ZIP: {
local $SIG{__WARN__} = sub {
die $_[0] if $_[0] =~ /^\s*format error:/; # raise exception, or
warn $_[0]; # re-emit the warning
};
eval { unzip($zipfile, $folder, $out) };
if ($@) {
# same as above...
}
};
Теперь, если из-за * появляется предупреждение1024 *, вместо печати вызывается сабвуфер со ссылкой, присвоенной $SIG{__WARN__}
.Затем, если сообщение предупреждения соответствует этому регулярному выражению, вместо этого выдается die
с этим сообщением.Поскольку это происходит внутри eval
, оно обрабатывается, как указано выше.См. %SIG
в perlvar .
Другой способ - просто вызвать исключение в $SIG{__WARN__}
для любого предупреждения (только внутри этого блока!), А затем обработать все детали в eval
обработчик.Обратите внимание, что local имеет решающее значение, так что мы не меняем принцип работы предупреждений по всему коду.
Это набросок (даже если он должен работать в том виде, в котором он стоит).Пожалуйста, изучите связанные документы.
† Раньше были тонкие ловушки с обработкой $@
напрямую (до v5.14).Несмотря на то, что это было решено, все это на самом деле низкоуровневое, и это может быть хорошей идеей, чтобы рассмотреть возможность использования модуля вместо этого.Это обернуло бы eval
+ $@
для облегчения пищеварения и, возможно, для более правильного использования.
Пожалуйста, ищите альтернативы, но имейте в виду, что мода менялась и что многие приходили и уходили годами.Вот одно недавнее обсуждение некоторых опций.