2012-09-12 2 views
5

ich habe:Code Fluss Erzwingen gehen Block auszunehmen

try: 
    ... 
except Exception, e: 
    print "Problem. %s" % str(e) 

jedoch irgendwo in versuchen, müssen ich es tun, als ob es eine Ausnahme aufgetreten. Ist es unpythonisch zu tun:

try: 
    ... 
    raise Exception, 'Type 1 error' 
    ... 

except Exception, e: 
    print "Problem. Type 2 error %s" % str(e) 
+0

es scheint wie schlechtes Design ... aber es ist üblich, Ausnahmen zu erheben ... aber nicht normalerweise auf diese Weise .. Warum musst du das tun? Vielleicht möchten Sie überdenken, was Sie erreichen möchten. –

+0

Die Ausnahmebehandlung ist in der Regel für das Auffangen und Behandeln von _unintended_ Fehlern ausgelegt. Exception _raising_ dient dazu, die Verbraucher auf Ihre Funktion eines Fehlers aufmerksam zu machen, der die Ausführung des Funktionsblocks verhindert hat, zusammen mit den Informationen, die Sie angeben möchten. Wenn Sie nur aus einem Funktionsblock als Teil eines beabsichtigten Verhaltens herausbrechen möchten, wäre die Verwendung einer Funktion und ihrer Rückgabewerte eine geeignetere Methode, um damit umzugehen. Das heißt, wenn Sie versuchen, das Verhalten des 'except'-Blocks zu testen, dann wäre es eine Möglichkeit, eine Ausnahme im' try' zu setzen. –

+0

Aber sieh dir den letzten Abschnitt des Python-Tutorials an: docs.python.org/tutorial/errors.html#raising-exceptions – user1008636

Antwort

5

Ich denke, das ist ein schlechtes Design. Wenn Sie eine Aktion ausführen müssen, wenn (und nur wenn) keine Ausnahme ausgelöst wurde, ist dies die Klausel else. Wenn Sie bedingungslos etwas unternehmen müssen, ist das finally für. hier ist eine Demonstration:

def myraise(arg): 
    try: 
     if arg: 
      raise ValueError('arg is True') 
    except ValueError as e: 
     print(e) 
    else: 
     print('arg is False') 
    finally: 
     print("see this no matter what") 

myraise(1) 
myraise(0) 

Sie müssen den unbedingten Code in finally und legte die anderen Sachen in except/else als angemessen berücksichtigen.

+0

Aber schau dir den letzten Abschnitt des Python-Tutorials an: http: //docs.python. org/tutorial/errors.html # raiting-exceptions – user1008636

+0

@ user1008636 - Das ist nur das Tutorial. Es wurde geschrieben, um explizit zu machen, dass in "try" eine Ausnahme ausgelöst wurde, und um zu demonstrieren, was in "except" oder "finally" passiert, wenn eine Ausnahme ausgelöst wird. Es soll kein Beispiel für eine gute Verwendung von "try"/"except" sein. – mgilson

4

Ich denke, was Sie tun, ist "unPythonic". Trys sollten wirklich nur den kleinen Teil des Codes abdecken (idealerweise eine Zeile), von dem Sie erwarten, dass er manchmal auf eine bestimmte Art und Weise versagt. Sie sollten in der Lage sein, try/except/else/finally zu verwenden, um das erforderliche Verhalten zu erhalten: