2010-10-08 29 views
79

Je fais face à un problème comment lever un avertissement en Python sans avoir à laisser le programme planter/arrêter/interruption.Comment lever un avertissement en Python sans arrêter (interrompre) le programme?

J'utilise la fonction simple suivante qui vérifie seulement si l'utilisateur lui a passé un nombre différent de zéro. Si l'utilisateur passe un zéro, le programme devrait avertir l'utilisateur, mais continuer normalement. Il devrait fonctionner comme le code suivant, mais devrait utiliser la classe Warning(), Error() ou Exception() au lieu d'imprimer l'avertissement manuellement. Si j'utilise le code ci-dessous et passe 0 à la fonction, le programme se bloque et la valeur n'est jamais retournée. Au lieu de cela, je veux que le programme continue normalement et informe simplement l'utilisateur qu'il a passé 0 à la fonction.

def isZero(i): 
    if i != 0: 
    print "OK" 
    else: 
    raise Warning("the input is 0!") 
    return i 

Le point est que je veux être en mesure de vérifier qu'un avertissement a été lancé par le test unittest. Si j'imprime simplement le message, je ne suis pas capable de le tester avec assertRaises en unittest.

Merci, Tomas

+0

Comment voulez-vous exactement pour informer l'utilisateur? par email ou SMS? Parce que cela peut être branché, mais vous devez être spécifique. – aaronasterling

+1

Pourquoi ne pas simplement "imprimer" le message? – sje397

+1

@ sje397 Le point est que je veux être capable de tester qu'un avertissement a été lancé en le testant par unittest. Si j'imprime simplement le message, je ne suis pas capable de le faire avec assertRaises en unittest. –

Répondre

68

Vous ne devriez pas raise l'avertissement, vous devez utiliser le module warnings. En l'élevant, vous générez des erreurs plutôt que des avertissements.

+1

Merci beaucoup. Et comment puis-je tester que l'avertissement a été lancé en utilisant unittest? Je ne peux plus utiliser assertRaises(). –

+0

@Tomas Novotny vous pouvez capturer stdout et stderr, puis vérifiez que les chaînes émises par votre avertissement se trouvent à l'intérieur. – wheaties

+10

@Tomas: Je n'ai jamais entendu parler du désir de tester l'avertissement, mais il existe un gestionnaire de contexte ['warnings.catch_warnings'] (http://docs.python.org/library/warnings.html#warnings.catch_warnings) qui Je vais vous laisser faire ça. – SilentGhost

139
import warnings 
warnings.warn("Warning...........Message") 

Voir la documentation python: here

+0

Cela devrait être la réponse. L'exemple tue le lien vers la documentation. –