2010-10-08 4 views
79

Ich habe es mit einem Problem zu tun, wie man eine Warnung in Python auslösen kann, ohne dass das Programm abstürzen muss.Wie kann man eine Warnung in Python auslösen, ohne das Programm anzuhalten (zu unterbrechen)?

Ich benutze folgende einfache Funktion, die nur prüft, ob der Benutzer eine von Null verschiedene Zahl übergeben. Übergibt der Benutzer eine Null, sollte das Programm den Benutzer warnen, aber normal weitermachen. Es sollte wie der folgende Code funktionieren, sollte aber die Klasse Warning(), Error() oder Exception() verwenden, anstatt die Warnung manuell auszugeben.

Wenn ich den folgenden Code verwenden und 0 an die Funktion übergeben, stürzt das Programm ab und der Wert wird nie zurückgegeben. Stattdessen möchte ich, dass das Programm normal fortfährt und nur den Benutzer informiert, dass er 0 an die Funktion übergeben hat.

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

Der Punkt ist, dass ich, dass eine Warnung durch Unittest geworfen wurde testen können, testen möchten. Wenn ich die Nachricht einfach ausdrucke, kann ich sie nicht mit assertRaises im Unittest testen.

Danke, Tomas

+0

Wie genau Sie den Benutzer benachrichtigen möchten? per E-Mail oder SMS? Ursache, die angeschlossen werden kann, aber Sie müssen spezifisch sein. – aaronasterling

+1

Warum druckst du die Nachricht nicht einfach? – sje397

+1

@ sje397 Der Punkt ist, dass ich in der Lage sein soll zu testen, dass eine Warnung geworfen wurde, die es durch unittest prüft. Wenn ich die Nachricht einfach ausdrucke, kann ich das mit assertRaises im Unittest nicht machen. –

Antwort

68

Sie sollten nicht raise die Warnung, Sie warnings Modul verwenden sollten. Wenn Sie es erhöhen, erzeugen Sie eher einen Fehler als eine Warnung.

+1

Vielen Dank. Und wie teste ich dann, dass die Warnung mit Unittest geworfen wurde? Ich kann assertRaises() nicht mehr verwenden. –

+0

@Tomas Novotny können Sie stdout und stderr erfassen, dann überprüfen Sie, ob die von Ihrer Warnung ausgegebenen Strings gefunden werden. – wheaties

+10

@Tomas: Ich habe nie von Wunsch, für Warnung zu testen, gehört, aber es gibt einen ['warnings.catch_warnings'] (http://docs.python.org/library/warnings.html#warnings.catch_warnings) Kontextmanager, der wird dich das machen lassen. – SilentGhost

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

Siehe die Python-Dokumentation: here

+0

Dies sollte die Antwort sein. Beispiel kills Link zur Dokumentation. –

Verwandte Themen