2010-10-23 5 views
22

J'ai remarqué que Exception.pm et Error.pm ne semblent pas être largement utilisés dans la communauté Perl. Est-ce dû à la grande empreinte de eval pour la gestion des exceptions?Quelle est la meilleure façon de gérer les exceptions dans Perl?

Aussi les programmes Perl semblent avoir une politique beaucoup plus clémente concernant la gestion des exceptions en général. Y a-t-il une raison impérieuse à cela?

Quoi qu'il en soit, quelle serait la meilleure méthode pour gérer les exceptions dans Perl?

+2

dupe de http://stackoverflow.com/questions/503189/is-object-oriented-exception-handling-in-perl-worth-it http://stackoverflow.com/questions/2165161/whats- broken-about-exceptions-in-perl http://stackoverflow.com/questions/2439966/do-you-use-an-exception-class-in-your-perl-programmes-pourquoi-ou-pourquoi-pas http://stackoverflow.com/questions/1426501/how-do-i-handle-exceptions-in-a-procedural-language - Avons-nous vraiment besoin d'un autre article sur la gestion des exceptions Perl? – Ether

+1

Voir ma réponse dans [Est-ce que Try :: Tiny est toujours recommandé pour la gestion des exceptions dans Perl 5.14 ou version ultérieure?] (Http://stackoverflow.com/a/10374265/2766176) –

Répondre

43

Le consensus de la communauté Perl semble être que Try::Tiny est la manière préférée de gérer les exceptions. La "politique indulgente" à laquelle vous faites référence est probablement due à une combinaison de:

  • Perl n'étant pas un langage entièrement orienté objet. (Par exemple, contrairement à Java où vous ne pouvez pas éviter les exceptions.)
  • L'arrière-plan de nombreux développeurs Perl. (Les langages comme C et le shell n'ont pas de mécanismes d'exception )
  • Le type de tâches que les gens ont tendance à utiliser pour Perl. (Petits scripts pour la fusion de texte et génération de rapports où la gestion des exceptions n'est pas nécessaire.)
  • Perl ne disposant pas d'un mécanisme d'exception (bon) intégré.

Notez que le dernier élément signifie que vous verrez beaucoup de code comme ceci:

eval { something() }; 
if ([email protected]) { 
    warn "Oh no! [[email protected]]\n"; 
} 

C'est la gestion des exceptions, même si elle n'utilise pas essayer/syntaxe catch. C'est fragile, cependant, et va casser dans un certain nombre de cas de bord subtiles que la plupart des gens ne pensent pas. Essayez :: Tiny et les autres modules de gestion des exceptions sur le CPAN ont été écrits pour faciliter les choses.

1. C a setjmp() et longjmp(), qui peut être utilisé pour une forme très brute de gestion des exceptions.

+2

+1 "simplifier * le bon fonctionnement " –

+15

Et juste pour éclaircir une idée fausse commune dont l'affiche originale pourrait ou pourrait ne pas souffrir:' eval BLOCK' est * pas * 'eval STRING' et ne compile pas de code au moment de l'exécution. C'est juste une méthode de gestion des exceptions - 'try' avec un nom drôle et une sémantique légèrement amusante. – hobbs

Questions connexes