2016-06-08 5 views
2

Wie kann ich testen, ob eine Funktion ein Ausnahmeobjekt zurückgegeben hat, wenn ich nicht im Voraus weiß, welche Art von Ausnahme ausgelöst wurde?Wie für ein Ausnahmeobjekt mit einer 'if' Anweisung zu testen?

def func(): 
    try: 
     bad_thing_happens # NameError("global name 'bad_thing_happens' is not defined",) 
     return True 
    except Exception as e: 
     return e 

result = func() 
if result == Exception: 
    print 'a bad thing happened' 

In diesem Fall wird die if-Anweisung zurückgibt False und ich würde die Ausnahme verpassen?

+2

Lassen Sie die Ausnahme nur außerhalb der Funktion propagieren und fangen Sie sie dann woanders ab. Sie müssen es nicht fangen und es dann zurückgeben, eine Ausnahme ist für einen außergewöhnlichen Umstand nicht als eine regelmäßige Rückkehr. – pvg

+1

Auch mindestens 9 mal von 10, fangen 'Exception' ist eine schlechte Idee. Wenn Sie den Typ der Ausnahme nicht kennen, wissen Sie sehr selten, wie Sie damit richtig umgehen müssen ... Manchmal ist es das Beste, wenn Sie Ihr Programm abstürzen lassen, sich die Stack-Trace ansehen, um herauszufinden, warum es gestorben und repariert wurde der Bug/die Logik, damit es beim nächsten Mal nicht stirbt. – mgilson

+0

Vielen Dank für Ihre tolle Antworten, Ausnahmen wurden nur viel klarer :) – derrend

Antwort

5

Der richtige Weg wäre, die Ausnahme außerhalb der Funktion zu fangen. Zum Beispiel:

def func(): 
    bad_thing_happens 
    # NameError("global name 'bad_thing_happens' is not defined",) 
    return True 

try: 
    result = func() 
except NameError: 
    print("a bad thing happened") 

Dies macht es klar, wo die Ausnahme kommt aus (die Funktion) und vermeidet das Durcheinander zu versuchen, eine Ausnahme zurück - schließlich sind Ausnahmen im Allgemeinen gefangen werden und nicht zurück gemeint.

2

Wenn Sie nicht die func() aus irgendeinem Grund ändern kann (zum Beispiel ist es ein Teil von einem Drittbibliothekscode), können Sie den Typ des zurückgegebenen Wert über isinstance() überprüfen:

if isinstance(result, Exception): 
    print 'a bad thing happened' 

Wenn Sie können func() ändern, dann sollten Sie keine Ausnahmen zurückgeben - sie sollen ausgelöst (und re-raised), abgefangen und behandelt werden (und auch nicht behandelt werden).

+0

oooh, ich mag das :) – derrend

6

Funktionen zurückgeben Ausnahmen, anstatt sie anzuheben oder sie blasen zu lassen, ist eine schlechte Sache.

Das heißt, Sie können testen, ob ein Objekt eine Instanz einer Klasse mit isinstance(object, klass) ist.