W Pythonie, jak mogę sprawdzić, a następnie ponownie zgłosić wyjątek, zachowując oryginalny stos wywołań?
Mam sytuację, w której łapię określony typ wyjątku, sprawdzając komunikat wyjątku, aby sprawdzić, czy faktycznie jest to wyjątek, który chcę przechwycić, a następnie ponownie zgłosić wyjątek, jeśli nie:
try:
# do something exception-prone
except FooException as e:
if e.message == 'Something I want to handle':
# handle the exception
else:
raise e
To działa dobrze, z jednym problemem. W przypadku ponownego zgłoszenia wyjątku ten wyjątek występuje teraz w wierszu, który go ponownie podniosłem (tj. Wraise e
), a nie w lokalizacji, w której pierwotnie wystąpił wyjątek. Nie jest to idealne rozwiązanie do debugowania, w którym chcesz wiedzieć, gdzie wystąpił oryginalny wyjątek.
Zatem moje pytanie: czy jest jakiś sposób na ponowne podniesienie lub w inny sposób „przekazanie” wyjątku po złapaniu go przy zachowaniu oryginalnej lokalizacji wyjątku?
UWAGA: W przypadku zastanawiania się, jaka jest rzeczywista sytuacja: dynamicznie importuję niektóre moduły za pomocą__import__
. ŁapięImportError
z wdzięcznością zająć się przypadkiem, że którykolwiek z tych modułów nie istnieje. Jednak w przypadku, gdy którykolwiek z tych modułów sam zawiera instrukcję importowania, która podnosiImportError
, Chcę, aby te „prawdziwe” (z punktu widzenia mojej aplikacji) wyjątki zostały podniesione - iw oryginalnej lokalizacji, jeśli chodzi o narzędzia do debugowania.