Хорошо, переработал мой ответ.
Я думаю, что проблема заключается в том, как вы справляетесь с ошибками. На первый взгляд сбивает с толку, чтобы увидеть один обработчик ошибок, когда у вас есть несколько мест, где все может пойти не так. Я вижу две альтернативы.
Во-первых, держать его в основном такой же, как у вас есть сейчас, но конкретно проверить для каждого типа ошибок:
my $record;
eval {
while (defined($record = $dataFile->getRecord)) {
$LT_DataFile->encode($record);
}
};
if (my $error = [email protected]) {
given ($error) {
when (/get record error/) { $rejectFile->writeRecord($_, undef); }
when (/encode error/) { $rejectFile->writeRecord($_, $record); }
}
}
Таким образом, вы явно в том, как вы справляетесь свои ошибки. Конечно, с Try :: Крошечный, это упрощает в следующем
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's answer. Это требует второго Eval или попытаться, ближе к проблеме и добавления last
вызова:
eval {
while (defined(my $record = $dataFile->getRecord)) {
eval { $LT_DataFile->encode($record) };
if (my $error = [email protected]) { $rejectFile->writeRecord($error, $record); last }
}
};
if (my $error = [email protected]) {
$rejectFile->writeRecord($error, undef);
}
К сожалению, этот метод не будет работать с Try :: Крошечными, так как блоки, передаваемые попробовать на самом деле subrefs.
Но вы проигнорировали комментарий, объясняющий, почему '$ record' должен быть' undef'. Если 'getRecord' выдает ошибку, вы будете сообщать о предыдущей (не ошибочной) записи. – cjm
Дерп, действительно. Исправлена. –
И теперь у вас есть противоположная проблема. Если 'encode' выдает ошибку, вы будете сообщать' undef' вместо записи, вызвавшей ошибку. – cjm