How do I catch an exception in a decorator but allow the caller to catch it as well?

decorator, exception, python

Solution

Just use `raise;` (i.e. do not raise anything specific, just `raise;`) in a `catch` block to re-raise the exception without "resetting" the traceback.

Problem

I have a python function that may raise an exception. The caller catches the exception and deals with it. Now I would like to add a decorator to that function that also catches the exception, does some handling, but then re-raises the exception to allow the original caller to handle it. This works, except that when the original caller displays the call stack from the exception, it shows the line in the decorator where it was re-raised, not where it originally occurred. Example code: ``` 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) ``` The output is: ``` 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 ``` I would like the decorator to be able to handle the exception but the traceback should indicate the `x = 1/0` line rather than the `raise` line. How can I do this?

Original source