2010-09-11 10 views
2

Quelle est la meilleure façon (standard) d'afficher une erreur à l'utilisateur en Python (par exemple: mauvaise syntaxe, arguments non valides, erreurs logiques)?Comment afficher l'erreur de l'utilisateur en Python

La méthode doit imprimer l'erreur dans l'erreur standard et quitter le programme.

Répondre

4

Dans les petits programmes, j'utiliser quelque chose comme ceci:

import sys 

def error(message): 
    sys.stderr.write("error: %s\n" % message) 
    sys.exit(1) 

Pour les plus grands outils, j'utilise le paquet logging.

def error(message): 
    logging.error('error: ', message) 
    sys.exit(1) 
+0

Comment puis-je utiliser la journalisation pour générer une erreur standard (je l'utilise déjà pour la sortie vers un fichier)? Comment puis-je séparer les deux flux? – yassin

+0

'logging' écrit dans' stderr' par défaut; Si vous voulez séparer les flux, regardez ceci: http://docs.python.org/library/logging.html#logging-to-multiple-destinations – leoluk

+0

Que diriez-vous de 'raise SystemExit' au lieu de' sys.exit', semble un peu plus pythonique pour moi. –

4

En Python 2, par exemple:

import sys 
print>>sys.stderr, "Found", numerrs, "errors in the input." 
sys.exit(1) 

En Python 3 (ou 2.6 ou 2.7 avec la déclaration from __future__ import print_function en haut de votre module), print devient une fonction et la syntaxe pour " d'erreur standard » est maintenant

print("Found", numerrs, "errors in the input.", file=sys.stderr) 

(une syntaxe un peu plus convivial que l'étrange >> nécessaire en Python 2 ;-). Le (petit) avantage de print par rapport à (disons) sys.stderr.write est que vous obtenez "toutes les commodités modernes": toutes les parties du message d'erreur sont automatiquement transformées en chaînes, elles sont sorties avec des séparateurs d'espace, et une ligne -end est sortie pour vous à la fin (sauf si vous demandez spécifiquement autrement). Pour utiliser sys.stderr.write, vous devez générer la chaîne exacte à produire, en utilisant généralement des constructions de formatage de chaîne - ce qui n'est pas une grosse affaire, bien sûr, juste une petite question de commodité.

logging est généralement préféré, mais pas quand vous voulez spécifiquement le message d'erreur pour aller à l'erreur standard et d'erreur standard seulement: logging offre beaucoup, beaucoup plus de possibilités (envoyer des messages de divers gravité, filtrer certains, mettre un peu à fichiers, et ainsi de suite), mais par conséquent, il est inévitablement un peu plus complexe.

+0

Une mise à jour pour clarifier le but de 'logging'. –