2010-08-30 13 views
28

J'utilise la vérification de syntaxe pour voir si mon script Perl est utilisé correctement. Si la syntaxe n'est pas correcte, j'affiche un message indiquant la syntaxe correcte, puis termine l'exécution du programme.Comment terminer un programme en Perl - quitter ou mourir?

Entre:

print "Please use the following syntax: ..."; 
exit 1; 

et:

die("Please use the following syntax: ..."); 

Lequel dois-je utiliser? Je sais que die aurait été la réponse si la gestion des exceptions était en place, mais ce n'est pas le cas.

Lequel est le meilleur choix pour la terminaison de programme sans traitement d'exception? S'il vous plaît dites aussi pourquoi.

+5

Il est à noter que 'die' ajoute automatiquement le nom de fichier et le numéro de ligne * sauf si * la chaîne d'erreur se termine par une nouvelle ligne' "\ n" '. –

Répondre

34

Cela dépend de ce que vous voulez obtenir avec STDERR et STDOUT. Je préfère envoyer des messages d'erreur et de type d'avertissement à STDERR de sorte que lorsque quelqu'un essaie de rediriger la sortie vers un fichier, ils voient toujours les messages d'erreur; Cependant, il y a des moments où STDOUT est utilisé pour communiquer le statut à l'utilisateur afin qu'il puisse tail -f ou le paginer, et à ce moment là écrire à STDERR leur cause de la douleur (ils doivent rediriger STDERR dans STDOUT avec 2>&1, et non tout le monde sait comment faire ça). Donc, qui utiliser, die ou print et exit, dépend fortement du type de programme que vous écrivez.

Il y a d'autres avantages/inconvénients à l'utilisation die:

  • Vous pouvez piéger die avec un eval, mais pas quitter
  • Vous pouvez exécuter du code lorsque le programme appelle die en installant un gestionnaire de signal pour la __DIE__ le signal
  • Vous pouvez facilement remplacer la fonction die

Chacun d'entre eux a des moments où il est pratique de pouvoir les faire, et des moments où c'est une douleur qu'ils peuvent faire.

+0

Et si vous avertissiez le message d'erreur et que vous utilisiez 'exit'? Considérez-vous que tirer le meilleur des deux? – Arc676

+1

@ Arc676 Étant donné que 'warn' écrit aussi sur STDERR, je ne vois pas comment cela pourrait être meilleur que' print' et 'exit' dans le scénario que j'ai décrit. Il est important de se rappeler qu'il n'y a pas de «meilleur»; il n'y a que des comportements qui peuvent être bénéfiques/nuisibles dans certaines circonstances. En général, la bonne réponse est de «mourir» car cela permet le plus de flexibilité dans le programme, mais vous devez garder à l'esprit comment l'utilisateur du programme va consommer la sortie. –

21

print imprime à STDOUT mais die imprime à STDERR

exit 1 sorties avec le statut de sortie de 1 mais die sorties avec la valeur actuelle de sortie de errno qui est $!

Ainsi die est le meilleur moyen comme plus simple et plus court.

+5

ou '$? >> 8' si '$!' Est '0'. ou 255 si '$? >> 8' est 0. –

+0

@Chas: Quels sont '$!', '$?'? – Lazer

+1

[$ OS_ERROR] (http://p3rl.org/var#%24OS_ERROR), [$ CHILD_ERROR] (http://p3rl.org/var#%24CHILD_ERROR) – daxim

Questions connexes