2013-06-26 9 views
21

Ich habe ein Problem mit meinem Code im try Block. Um es einfach, dies ist mein Code:Mehrere versuchen Codes in einem Block

try: 
    code a 
    code b #if b fails, it should ignore, and go to c. 
    code C#if c fails, go to d 
    code d 
except: 
    pass 

Ist so etwas möglich?

+1

Um explizit, Sie 'Code c ' ausgeführt werden * nur wenn Code b eine Ausnahme auslöst *? –

+0

Alle Codes sollten in einem try-Block ausgeführt werden, auch wenn sie eine Ausnahme auslösen. – arvidurs

+0

Das kann man nicht haben. Ein "try" -Block ist nicht dazu da, Ausnahmen über den gesamten ausgeführten Code hinweg zu unterdrücken. Es wird Ihnen erlauben, die Ausnahme zu fangen, wenn es passiert, aber der Rest des Blocks wird niemals ausgeführt. –

Antwort

30

Sie finden diese separatentry Blöcke machen müssen:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    try: 
     code c 
    except ExplicitException: 
     try: 
      code d 
     except ExplicitException: 
      pass 

Dies setzt voraus, Sie nur wenn code b nicht ausgeführt code c wollen.

Wenn Sie code cunabhängig ausführen können, müssen Sie die try Blöcke nacheinander setzen:

try: 
    code a 
except ExplicitException: 
    pass 

try: 
    code b 
except ExplicitException: 
    pass 

try: 
    code c 
except ExplicitException: 
    pass 

try: 
    code d 
except ExplicitException: 
    pass 

ich except ExplicitException hier bin mit, weil es nie blind eine gute Praxis ist, Ignoriere alle Ausnahmen. Sie ignorieren MemoryError, KeyboardInterrupt und SystemExit auch sonst, die Sie normalerweise nicht ignorieren oder abfangen möchten, ohne irgendeine Art von Re-Raise oder bewussten Grund für die Handhabung dieser.

+0

Python Exception Handling ist nur so hässlich, es macht Sie Code schreiben, die für C-Style-Makros schreit. – Elazar

+3

@Elazar: Wenn Ihr Code wie oben aussieht, wollen Sie wirklich überdenken, was Sie tun. Mit Kontext-Managern und einigen Refactoring-Funktionen können die meisten Code zur Ausnahmebehandlung viel lesbarer und wartbarer gemacht werden. –

+0

Die Frage ist, sollte ich es nur umdenken, weil es Python ist, so muss ich sowohl Ausnahmen und Einrückung verwenden. Vier einfache Operationen, jede sollte nur ausgeführt werden, wenn die letzte fehlgeschlagen ist, und Sie erhalten 4 Ebenen der Einrückung. uh. Wenn Ausnahmen gut sind, sollte ihre Verwendung syntaktisch gefördert werden. – Elazar

3

Extrahieren Sie (refactor) Ihre Aussagen. Und nutzen Sie die Magie von and und or zu entscheiden, wann zu kurzschließen.

def a(): 
    try: # a code 
    except: pass # or raise 
    else: return True 

def b(): 
    try: # b code 
    except: pass # or raise 
    else: return True 

def c(): 
    try: # c code 
    except: pass # or raise 
    else: return True 

def d(): 
    try: # d code 
    except: pass # or raise 
    else: return True 

def main(): 
    try: 
     a() and b() or c() or d() 
    except: 
     pass 
+1

'außer: heben '? Welchen Punkt gibt es darin? Die Ausnahme wird den Rest der Anrufe noch abbrechen. –

+0

Es wird kommentiert, hängt davon ab, ob er fortfahren oder anhalten möchte. –

+1

Ich denke, ein Dekorateur würde hier passen. – Elazar

1

Wenn Sie an der Kette nicht wollen (eine große Anzahl von) try-except-Klauseln, können Sie Ihre Codes in einer Schleife versuchen und auf ersten Erfolg brechen.

Beispiel mit Codes, die in Funktionen eingesetzt werden können:

for code in (
    lambda: a/b, 
    lambda: a/(b + 1), 
    lambda: a/(b + 2), 
    ): 
    try: print(code()) 
    except Exception as ev: continue 
    break 
else: 
    print("it failed: %s" % ev) 

Beispiel mit beliebigen Codes (Aussagen) direkt im aktuellen Bereich:

for i in 2, 1, 0: 
    try: 
     if i == 2: print(a/b) 
     elif i == 1: print(a/(b + 1)) 
     elif i == 0: print(a/(b + 2)) 
     break   
    except Exception as ev: 
     if i: 
      continue 
     print("it failed: %s" % ev) 
Verwandte Themen