Хорошо, переработал мой ответ.
Я думаю, что проблема REAL в том, как вы обрабатываете ошибки.На первый взгляд сбивает с толку возможность увидеть один обработчик ошибок, когда у вас есть несколько мест, где что-то может пойти не так.Я вижу две альтернативы.
Во-первых, оставьте это в основном таким же, как сейчас, но определенно проверьте для каждого типа ошибки:
my $record;
eval {
while (defined( $record = $dataFile->getRecord )) {
$LT_DataFile->encode($record);
}
};
if (my $error = $@) {
given ($error) {
when (/get record error/) { $rejectFile->writeRecord($_, undef); }
when (/encode error/) { $rejectFile->writeRecord($_, $record); }
}
}
Таким образом, вы явно указалиВы обрабатываете свои ошибки.Конечно, с Try :: Tiny это упрощается до следующего
my $record;
try {
while (defined( $record = $dataFile->getRecord )) {
$LT_DataFile->encode($record);
}
} catch {
when (/get record error/) { $rejectFile->writeRecord($_, undef); }
when (/encode error/) { $rejectFile->writeRecord($_, $record); }
}
В качестве альтернативы, вы можете добавить лексическую запись в ответ Daxim .Это требует второго eval или try, ближе к проблеме и добавления вызова last
:
eval {
while (defined( my $record = $dataFile->getRecord )) {
eval { $LT_DataFile->encode($record) };
if (my $error = $@) { $rejectFile->writeRecord($error, $record); last }
}
};
if (my $error = $@) {
$rejectFile->writeRecord($error, undef);
}
К сожалению, этот метод не будет работать с Try :: Tiny, потому что блоки, переданные для попытки, на самом делеsubrefs.