Como capturar uma exceção em um decorador, mas permitir que o chamador também a capture?
Eu tenho uma função python que pode gerar uma exceção. O chamador captura a exceção e lida com ela. Agora eu gostaria de adicionar um decorador a essa função queAlém disso captura a exceção, realiza alguma manipulação, mas depois gera novamente a exceção para permitir que o chamador original lide com ela. Isso funciona, exceto que, quando o chamador original exibe a pilha de chamadas da exceção, ele mostra a linha no decorador onde foi gerada novamente, e não onde ocorreu originalmente. Código de exemplo:
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)
A saída é:
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
Gostaria que o decorador fosse capaz de lidar com a exceção, mas o retorno deve indicar ox = 1/0
linha ao invés doraise
linha. Como posso fazer isso?