Sto scrivendo un modulo e voglio avere una gerarchia di eccezioni unificate per le eccezioni che può sollevare (ad esempio ereditando da una classe astratta FooError
per tutti gli foo
eccezioni specifiche del modulo). Ciò consente agli utenti del modulo di rilevare quelle particolari eccezioni e gestirle distintamente, se necessario. Ma molte delle eccezioni sollevate dal modulo vengono sollevate a causa di qualche altra eccezione; per esempio. errore in qualche attività a causa di un OSError su un file.Rilanciare l'eccezione con un tipo e un messaggio diversi, mantenendo le informazioni esistenti
Quello che mi serve è "avvolgere" l'eccezione rilevata in modo che abbia un tipo e un messaggio diversi, in modo che le informazioni siano disponibili più in alto nella gerarchia di propagazione da qualunque sia l'eccezione. Ma non voglio perdere il tipo, il messaggio e lo stack esistenti; sono tutte informazioni utili per qualcuno che cerca di eseguire il debug del problema. Un gestore di eccezioni di primo livello non va bene, dal momento che sto tentando di decorare l'eccezione prima che raggiunga lo stack di propagazione e il gestore di livello superiore sia troppo tardi.
Questo è in parte risolto derivando miei tipi di eccezione specifici s' modulo foo
dal tipo esistente (es class FooPermissionError(OSError, FooError)
), ma che non lo rende più facile per avvolgere l'istanza eccezione esistente in un nuovo tipo, né modificare la Messaggio.
“concatenamento delle eccezioni e di traceback embedded” PEP 3134 di Python discute un cambiamento accettato in Python 3.0 per “concatenamento” oggetti di eccezione, per indicare che una nuova eccezione è stata sollevata durante la manipolazione di un'eccezione esistente.
Quello che sto cercando di fare è relativo: ho bisogno che funzioni anche nelle versioni precedenti di Python, e non ne ho bisogno per il concatenamento, ma solo per il polimorfismo. Qual è il modo giusto per farlo?
eccezioni già sono completamente polimorfica - sono tutte sottoclassi di Eccezione. Cosa stai cercando di fare? "Messaggio diverso" è abbastanza banale con un gestore di eccezioni di primo livello. Perché stai cambiando la classe? –
Come spiegato nella domanda (ora, grazie per il tuo commento): Sto cercando di decorare un'eccezione che ho catturato, in modo che possa propagarsi più in alto con più informazioni ma senza perdere nulla. Un gestore di livello superiore è troppo tardi. – bignose
Si prega di dare un'occhiata alla mia [classe CausedException] (http://code.activestate.com/recipes/578252-python-exception-chains-or-trees/?in=user-4182236) che può fare ciò che si desidera in Python 2.x. Inoltre in Python 3 può essere utile nel caso in cui si desideri fornire più di un'eccezione originale come causa della propria eccezione. Forse si adatta alle tue esigenze. – Alfe