from __future__ import with_statement
from contextlib import contextmanager
from functools import wraps
import logging
@contextmanager
def error_trapping(ident=None):
''' A context manager that traps and logs exception in its block.
Usage:
with error_trapping('optional description'):
might_raise_exception()
this_will_always_be_called()
'''
try:
yield None
except Exception:
if ident:
logging.error('Error in ' + ident, exc_info=True)
else:
logging.error('Error', exc_info=True)
def trap_errors(f):
''' A decorator to trap and log exceptions '''
@wraps(f)
def wrapper(*args, **kwds):
with error_trapping(f.__name__):
return f(*args, **kwds)
return wrapper