2015-10-19 6 views
5

Ich frage mich, ob Sie eine (spezifische) abgefangene Ausnahme erneut auslösen können und sie von einem späteren (allgemeinen) abgefangen wird, außer im selben try-except. Als Beispiel möchte ich etwas mit einem bestimmten IOError machen, aber wenn es nicht der erwartete IOError ist, dann sollte die Ausnahme wie jeder andere Fehler behandelt werden. Was ich zunächst versucht:Python 'except' fall-through

try: 
    raise IOError() 
except IOError as ioerr: 
    if ioerr.errno == errno.ENOENT: 
     # do something with the expected err 
    else: 
     # continue with the try-except - should be handled like any other error 
     raise 
except Exception as ex: 
    # general error handling code 

Allerdings funktioniert das nicht: die Erhöhung wieder wirft die Ausnahme außerhalb des Kontextes des try-except. Was wäre die pythonische Schreibweise, um das gewünschte "Fall-through" -Ausmaß zu erhalten?

(Ich bin bewusst, dass es war ein vorgeschlagener ‚bedingte Ausnahme‘, dass nicht umgesetzt wurde, was diese gelöst haben könnte)

+1

Sie möchten also vom 'extend IOError' Block zum' except Exception' Block gehen? Soweit mir bekannt ist, ist das nicht möglich, nur ein "except" -Block (oder der "else" -Block) läuft für einen gegebenen "try". Du könntest die ganze Sache in einen anderen "Versuch" wickeln und entfernst den inneren 'except Exception', was bedeutet, dass alle außer den spezifisch behandelten 'IOError's in den äußeren' try's' außer ''' landen. – jonrsharpe

+0

Das ist, was ich tun möchte, und ich war besorgt, dass nur eine einzige außer möglich wäre. Ich hoffe auf eine elegantere Lösung, die etwas wie verschachteltes else/code duplication – OverlordAlex

Antwort

1

Ich bin kein Experte pythonically in schriftlicher Form, aber ich denke, einen offensichtlichen Ansatz (wenn Sie wissen, dass Sie eine bestimmte Art von Ausnahme erwar), wäre verschachtelte Ausnahmebehandlung zu verwenden:

try: 
    try: 
     raise IOError() 
    except IOError as ioerr: 
     if ioerr.errno == errno.ENOENT: 
      # do something with the expected err 
     else: 
      # pass this on to higher up exception handling 
      raise 

except Exception as ex: 
    # general error handling code 

ich in Ihrem Kommentar weiß, dass Sie nicht verschachteltes anderes wollten - ich weiß nicht, Wenn die geschachtelte Ausnahmebehandlung in Ihrem Buch so schlecht ist, können Sie Code-Duplizierung zumindest vermeiden.

+0

Dies ist ein großartiger Ansatz, es scheint wirklich offensichtlich, sobald Sie es gesehen haben. Sehr coole Idee! – iFreilicht

1

Also arbeite ich an der gleichen hier, und nach der Überprüfung der verfügbaren Lösungen, werde ich mit dem Abfangen der Eltern-Ausnahme gehen, und dann für Details zu testen. In meinem Fall arbeite ich mit dem DNS-Modul.

try: 
    answer = self._resolver.query(name, 'NS') 
except dns.exception.DNSException, e: #Superclass of exceptions tested for 
    if isinstance(e, dns.resolver.NXDOMAIN): 
     #Do Stuff 
    elif isinstance(e, dns.resolver.NoAnswer): 
     # Do other stuff 
    else: 
     # Do default stuff 
Verwandte Themen