Sto scrivendo un modulo e voglio avere una gerarchia di eccezioni unificata per le eccezioni che può sollevare (ad esempio ereditando da una FooError
classe astratta per tutte le foo
eccezioni specifiche del modulo). Ciò consente agli utenti del modulo di catturare quelle particolari eccezioni e gestirle distintamente, se necessario. Ma molte delle eccezioni sollevate dal modulo sono sollevate a causa di qualche altra eccezione; ad es. errore in alcune attività a causa di un errore OSE su un file.
Ciò di cui ho bisogno è "racchiudere" l'eccezione rilevata in modo tale che abbia un tipo e un messaggio diversi , in modo che le informazioni siano disponibili più in alto nella gerarchia di propagazione da qualsiasi cosa catturi l'eccezione. Ma non voglio perdere il tipo, il messaggio e la traccia dello stack esistenti; sono tutte informazioni utili per qualcuno che cerca di eseguire il debug del problema. Un gestore di eccezioni di livello superiore non va bene, dal momento che sto cercando di decorare l'eccezione prima che raggiunga lo stack di propagazione e il gestore di livello superiore è troppo tardi.
Ciò è parzialmente risolto derivando foo
i tipi di eccezione specifici del mio modulo dal tipo esistente (ad esempio class FooPermissionError(OSError, FooError)
), ma ciò non semplifica il wrapping dell'istanza di eccezione esistente in un nuovo tipo, né modifica il messaggio.
PEP 3134 di Python "Eccezione concatenata e tracciati incorporati" discute una modifica accettata in Python 3.0 per "concatenare" oggetti eccezione, per indicare che è stata sollevata una nuova eccezione durante la gestione di un'eccezione esistente.
Quello che sto cercando di fare è correlato: ne ho bisogno che funzioni anche nelle precedenti versioni di Python e non ne ho bisogno per il concatenamento, ma solo per il polimorfismo. Qual è il modo giusto per farlo?
except Exception as e
-> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> questa soluzione proviene da un'altra domanda SO . Questo non è carino ma funzionale.