2013-08-22 7 views
8

Ich lerne Python und bin auf ein Konzept gestoßen, das ich nicht ohne weiteres verdauen kann: den optionalen else Block innerhalb des try Konstrukts.Warum sonst noch in try/except in Python konstruieren?

Nach the documentation:

Die try ... except-Anweisung hat eine optionale else-Klausel, die, wenn sie vorhanden, muss außer Klauseln werden alle. Es ist nützlich für Code, dass ausgeführt werden muss, wenn die try-Klausel keine Ausnahme auslöst.

Was ich bin verwirrt darüber, warum haben die Code, wenn die try-Klausel ausgeführt werden müssen keine Ausnahme innerhalb des try-Konstrukt erhöhen - warum nicht einfach haben, es folgen die Try/außer an der gleichen Einzugsebene? Ich denke, es würde die Optionen für die Ausnahmebehandlung vereinfachen. Oder eine andere Art zu fragen wäre, was der Code im Block else tun würde, würde nicht getan werden, wenn er einfach der try-Anweisung folgen würde, unabhängig davon. Vielleicht vermisse ich etwas, erleuchte mich.

Diese Frage ist ähnlich wie this one aber ich konnte nicht finden, wonach ich suche.

Antwort

11

Der else Block wird nur ausgeführt, wenn der Code in try keine Ausnahme auslöst; Wenn Sie den Code außerhalb des Blocks else platzieren, würde dies unabhängig von Ausnahmen passieren. Auch passiert es vor der finally, die allgemein wichtig ist.

Dies ist im Allgemeinen nützlich, wenn Sie einen kurzen Setup- oder Verifizierungsabschnitt haben, der möglicherweise fehlerhaft ist, gefolgt von einem Block, in dem Sie die Ressourcen verwenden, in denen Sie Fehler nicht ausblenden möchten. Sie können den Code nicht in try setzen, da Fehler zu except-Klauseln gehen können, wenn Sie sie propagieren möchten. Sie können es nicht außerhalb des Konstrukts platzieren, da die Ressourcen dort definitiv nicht verfügbar sind, entweder weil die Einrichtung fehlgeschlagen ist oder weil die finally alles abgerissen hat. Sie haben also einen else Block.

+0

ah, OK ... macht absolut Sinn. Warum also nicht am Ende des Probierabschnitts? ist es wegen der Möglichkeit, dass der Code selbst die Ausnahme auslöst und Sie den Umfang der Ausnahme Herkunft begrenzen wollen? – amphibient

+2

Yup. Es ist üblich, es in anderen Sprachen in "try" zu schreiben, besonders wenn es keinen 'except' Block gibt, aber in Python haben wir' else', also verwenden wir das. – user2357112

+0

ausgezeichnete Klarstellung, danke – amphibient

4

Ein Anwendungsfall kann sein, zu verhindern, dass Benutzer eine Flag-Variable definieren, um zu überprüfen, ob eine Ausnahme ausgelöst wurde oder nicht (wie wir es in for-else Schleife tun).

Ein einfaches Beispiel:

lis = range(100) 
ind = 50 
try: 
    lis[ind] 
except: 
    pass 
else: 
    #Run this statement only if the exception was not raised 
    print "The index was okay:",ind 

ind = 101 

try: 
    lis[ind] 
except: 
    pass 
print "The index was okay:",ind # this gets executes regardless of the exception 

# This one is similar to the first example, but a `flag` variable 
# is required to check whether the exception was raised or not. 

ind = 10 
try: 
    print lis[ind] 
    flag = True 
except: 
    pass 

if flag: 
    print "The index was okay:",ind 

Ausgang:

The index was okay: 50 
The index was okay: 101 
The index was okay: 10 
Verwandte Themen