У меня есть функция Python, которая может вызвать исключение. Звонящий перехватывает исключение и обрабатывает его. Теперь я хотел бы добавить к этой функции декоратор, который также перехватывает исключение, выполняет некоторую обработку, но затем повторно вызывает исключение, чтобы оригинальный обработчик мог его обработать. Это работает, за исключением того, что, когда исходный вызывающий абонент отображает стек вызовов из исключения, он показывает строку в декораторе, где он был повторно вызван, а не там, где он первоначально произошел. Пример кода:
import sys,traceback
def mydec(func):
def dec():
try:
func()
except Exception,e:
print 'Decorator handled exception %s' % e
raise e
return dec
@mydec
def myfunc():
x = 1/0
try:
myfunc()
except Exception,e:
print 'Exception: %s' % e
type,value,tb = sys.exc_info()
traceback.print_tb(tb)
Вывод:
Decorator handled exception integer division or modulo by zero
Exception: integer division or modulo by zero
File "allbug.py", line 20, in <module>
myfunc()
File "allbug.py", line 9, in dec
raise e
Я бы хотел, чтобы декоратор мог обрабатывать исключение, но трассировка должна указывать строку x = 1/0
, а не raise
. Как я могу это сделать?