Ok, retravaillé ma réponse.
Je pense que le problème REAL est comment vous gérez les erreurs. Il est déroutant à première vue de voir un gestionnaire d'erreur unique lorsque vous avez plusieurs endroits où les choses pourraient mal tourner. Je vois deux alternatives.
D'abord, garder la plupart du temps la même chose que vous avez maintenant, mais il faut vérifier spécifiquement pour chaque type d'erreur:
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); }
}
}
De cette façon, vous êtes explicite dans la façon dont vous gérez vos erreurs. Bien sûr, avec Try :: minuscule, cela simplifie les éléments suivants dans
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); }
}
Sinon, vous pouvez ajouter l'enregistrement lexical par Daxim's answer. Cela nécessite une seconde eval ou d'essayer, plus près du problème et l'ajout d'un appel 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);
}
Malheureusement, cette méthode ne fonctionnera pas avec Try :: minuscule, parce que les blocs sont passés à essayer subrefs réellement.
Mais vous avez ignoré le commentaire expliquant pourquoi '$ record' doit être' undef'. Si 'getRecord' renvoie une erreur, vous signalez l'enregistrement précédent (non erroné). – cjm
Derp, en effet. Fixé. –
Et maintenant vous avez le problème inverse. Si 'encoder' renvoie une erreur, vous rapporterez' undef' à la place de l'enregistrement qui a provoqué l'erreur. – cjm