Как мне перехватить исключение в декораторе, но позволить вызывающему также перехватить его?

У меня есть функция 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 , а не поднять линия. Как я могу это сделать?

15
задан Graeme Perrow 22 November 2010 в 20:48
поделиться