在try / except中使用装饰器包装类方法

时间:2014-04-22 12:03:41

标签: python python-2.7 decorator python-decorators

我有一个通用功能,可以将有关异常的信息发送到应用程序日志。 我在类的方法中使用exception_handler函数。传递给exception_handler并由def exception_handler(log, terminate=False): exc_type, exc_value, exc_tb = sys.exc_info() filename, line_num, func_name, text = traceback.extract_tb(exc_tb)[-1] log.error('{0} Thrown from module: {1} in {2} at line: {3} ({4})'.format(exc_value, filename, func_name, line_num, text)) del (filename, line_num, func_name, text) if terminate: sys.exit() 调用的应用程序日志处理程序会创建一个JSON字符串,该字符串实际上是发送到日志文件的。一切正常。

from utils import exception_handler

class Demo1(object):
    def __init__(self):
        self.log = {a class that implements the application log}

    def demo(self, name):
        try:
            print(name)
        except Exception:
            exception_handler(self.log, True)

我使用它如下:(一个超简化的例子)

exception_handler

我想改变@handle_exceptions def func1(self, name) {some code that gets wrapped in a try / except by the decorator} 作为大量方法的装饰者,即:

exception_handler

我看了很多关于装饰者的文章,但我还没弄明白如何实现我想做的事情。我需要传递对活动日志对象的引用,并将0或更多参数传递给包装函数。如果能让事情变得更轻松,我很乐意将{{1}}转换为类中的方法。

2 个答案:

答案 0 :(得分:8)

这样的装饰者就是:

def handle_exceptions(f):
    def wrapper(*args, **kw):
        try:
            return f(*args, **kw)
        except Exception:
            self = args[0]
            exception_handler(self.log, True)
    return wrapper

这个装饰器只是在try套件中调用包装函数。

这可以仅应用于方法,因为它假设第一个参数是self

答案 1 :(得分:0)

感谢Martijn指出我正确的方向。 我无法得到他建议的解决方案,但经过一些基于他的例子的搜索,以下工作正常:

def handle_exceptions(fn):
    from functools import wraps
    @wraps(fn)
    def wrapper(self, *args, **kw):
        try:
            return fn(self, *args, **kw)
        except Exception:
            exception_handler(self.log)
    return wrapper