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

У меня есть функция 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 , а не на повышение . строка. s порт для ssh уже перенаправлен, должен ли я добавлять новые для git?

И, наконец, имеет ли эта организация смысл использовать git или есть лучший продукт для меня

Спасибо

15
задан Alex Angelini 22 November 2010 в 20:32
поделиться