2010-09-24 7 views
1

Je suis habitué à `... ou mourir" .. échoué ... $! ";.Comment puis-je vérifier si `File :: Path :: remove_tree` a échoué?

je fus surpris de constater que, afin de savoir si File::Path::remove_tree a échoué ou non je dois faire quelque chose comme ceci:

remove_tree('foo/bar', 'bar/rat', {error => \my $err}); 
if (@$err) { 
die "error..." 
} 

Est-ce que je manque quelque chose? Est-ce vraiment le chemin à parcourir?

beaucoup de code inutile pour moi ...

Répondre

3

remove_tree renvoie le nombre de fichiers supprimés avec succès, il faut une autre méthode de signaler une erreur à une valeur de retour. Gardez à l'esprit qu'un certain nombre de fichiers ont peut-être été supprimés avant qu'une erreur ne soit rencontrée. Par conséquent, vous ne pouvez pas compter sur la valeur retournée étant 0 comme indiquant une erreur. Que ce soit le chemin à suivre pour signaler des erreurs est une question de goût.

De la documentation eux-mêmes:

REMARQUE: Le mécanisme de gestion des erreurs est considérée comme expérimentale et qui suit est sujette à changement> en attente des commentaires des utilisateurs.

+3

en d'autres termes "Si vous avez une meilleure idée, je suis tout ouïe!" – Ether

1

je supprimer un chemin à un moment puis vérifiez si elle est toujours là après:

foreach my $path (@paths) { 
     my $rc = remove_tree($path, { ... }); 
     die ... if -e $path; 
     } 

Comme Dancrumb said, vous ne pouvez pas faire confiance à la valeur de retour.

+0

+1 Oui, je sais que la valeur de retour n'est pas pertinente ici. Je me demandais simplement si cela était commun à un test d'échec si «exigeant». –

+0

Quand j'ai affaire au système et que c'est important, c'est ce que je fais. Ce n'est pas si exigeant. –

1

The docs disent qu'il soulève des exceptions:

Si make_path ou remove_tree rencontre une erreur, un message de diagnostic sera imprimé à STDERR via la carpe (pour les erreurs non fatales), ou via croassement (pour des erreurs fatales).

Cela nous a permis d'utiliser la gestion des exceptions standard au moins pour les erreurs marquées fatales.

use Try::Tiny; 
try { 
    … remove_tree … 
} catch { 
    warn "remove_tree failed: $_"; 
}; 

Les avertissements peuvent être fatalised en quelque sorte, aussi, mais je ne peux rien décent en ce moment, sauf aliasing File::Path::_carp-File::Path::_croak.

Questions connexes