No Python, como faço para inspecionar e reaumentar uma exceção enquanto mantenho a pilha de chamadas original?
Eu tenho uma situação onde eu estou pegando um tipo de exceção específico, inspecionando a mensagem da exceção para verificar se é realmente uma exceção que eu quero pegar, e então re-elevando a exceção se não:
try:
# do something exception-prone
except FooException as e:
if e.message == 'Something I want to handle':
# handle the exception
else:
raise e
Isso funciona bem, com um problema. No caso de eu re-levantar a exceção, essa exceção agora ocorre na linha que eu re-levantou-a (ou seja, emraise e
), e não no local onde a exceção ocorreu originalmente. Isso não é ideal para depuração, onde você quer saber onde a exceção original aconteceu.
Assim, a minha pergunta: existe alguma maneira de re-raise ou "passar" uma exceção depois de pegá-lo, mantendo o local original da exceção?
NOTA: Caso você esteja se perguntando qual é a situação real: estou importando dinamicamente alguns módulos usando__import__
. Estou pegandoImportError
para lidar graciosamente com o caso de que qualquer um desses módulos não existe. No entanto, no caso de qualquer um desses módulos conter uma declaração de importação que aumenteImportError
, Eu quero que as exceções "reais" (do ponto de vista da minha aplicação) sejam levantadas - e no local original, no que diz respeito às ferramentas de depuração.