2012-08-31 11 views
7

Ho una situazione in cui sto cattura di un determinato tipo di eccezione, ispezionando il messaggio del un'eccezione per verificare se in realtà è un'eccezione voglio prendere, e poi ri-sollevare l'eccezione, se non:In Python, come ispezionare e quindi sollevare nuovamente un'eccezione mantenendo lo stack di chiamate originale?

try: 
    # do something exception-prone 
except FooException as e: 
    if e.message == 'Something I want to handle': 
     # handle the exception 
    else: 
     raise e 

Funziona bene, con un problema. Nel caso in cui io rileggi l'eccezione, quell'eccezione ora si verifica sulla linea che ho controrilanciato (vale a dire a raise e), piuttosto che nel luogo in cui si è originariamente verificata l'eccezione. Questo non è l'ideale per il debug, in cui si desidera sapere dove si è verificata l'eccezione originale.

Quindi la mia domanda: esiste un modo per controrilanciare o altrimenti "passare" un'eccezione dopo averla catturata mantenendo la posizione di eccezione originale?

NOTA: Nel caso in cui vi stiate chiedendo quale sia la situazione effettiva: sto importando dinamicamente alcuni moduli utilizzando __import__. Sto prendendo lo ImportError per gestire con grazia il caso che uno di questi moduli non esiste. Tuttavia, nel caso in cui uno di questi moduli stessi contenga una dichiarazione di importazione che solleva ImportError, voglio che vengano sollevate le eccezioni "reali" (dal punto di vista della mia applicazione) - e nella posizione originale fino al debug strumenti sono interessati.

risposta

7

Basta fare:

raise 

invece di raise e. Vedere la sezione tutorial su raising exceptions, e anche il language reference on raise statements:

Se non sono presenti espressioni, aumentare ri-solleva l'ultima eccezione che era attiva nel campo di applicazione attuale. Se nessuna eccezione è attiva nell'ambito corrente, viene sollevata un'eccezione TypeError che indica che si tratta di un errore (se è in esecuzione in IDLE, viene invece sollevata un'eccezione Queue.Empty).

+0

Duh! Facile. Stavo guardando il riferimento per provare/tranne e ho dimenticato di guardare al rilancio. Grazie. – Ghopper21

Problemi correlati