2015-10-19 20 views
5

Mi stavo chiedendo se si potesse controrilanciare un'eccezione (specifica) rilevata e farla catturare da una versione successiva (generale) tranne che nella stessa prova, eccetto. Ad esempio, voglio fare qualcosa con un IOError specifico, ma se non è l'IOError previsto, l'eccezione dovrebbe essere gestita come qualsiasi altro errore. Quello che ho inizialmente provato: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 

Tuttavia, questo non funziona: il rilancio ri-solleva l'eccezione di fuori del contesto del try-except. Quale sarebbe il modo pititico di scrivere questo per ottenere il comportamento 'fall-through' dell'eccezione desiderata?

(Sono consapevole c'era un proposto 'condizionale tranne' che non è stato attuato, che potrebbe aver risolto questo)

+1

Quindi si desidera passare dal blocco "tranne IOError' al blocco" tranne eccezione "? Per quanto ne so che non è possibile, solo un blocco 'tranne' (o il blocco' else') viene eseguito per un determinato 'try'. Potresti racchiudere il tutto in un altro 'try', rimuovendo l'interiore' except Exception', il che significherebbe tutto tranne che l'IOError '' Handling 'specifico' finirà nell'esterno 'try''s' except's. – jonrsharpe

+0

Questo è quello che voglio fare, ed ero preoccupato che solo un singolo fosse possibile. Spero che una soluzione più elegante sia qualcosa di simile alla duplicazione nidificata di altri/codice – OverlordAlex

risposta

1

Io non sono un esperto in scrittura pythonically, ma penso che uno approccio più ovvio (se si sa che vi aspettate un particolare tipo di eccezione), sarebbe quella di utilizzare nidificato la gestione delle eccezioni:

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 

so che nel vostro commento che non volevi nidificato altro - non so se la gestione delle eccezioni annidate è così male nel tuo libro, ma per lo meno puoi evitare la duplicazione del codice.

+0

Questo è un approccio eccezionale, sembra davvero ovvio una volta che l'hai visto. Ottima idea! – iFreilicht

1

Quindi, sto lavorando allo stesso qui, e dopo aver esaminato le soluzioni disponibili, ho intenzione di catturare l'eccezione genitore, e quindi testare le specifiche. Nel mio caso sto lavorando con il modulo dns.

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 
Problemi correlati