一个类的python自定义异常处理程序

时间:2014-02-18 12:21:54

标签: python exception

我想用redis缓存构建我的应用程序。但是在我们的情况下,也许redis不可用,
我希望,redis运行良好,我们使用它。如果它无法工作,只需记录并忽略它。

例如:

try:
  conn.sadd('s', *array)
except :
  ...

因为有很多地方我会运行一些conn。{rediscommand},我不喜欢尝试/除了每个地方。

所以解决方案可能是:

class softcache(redis.StrictRedis):
   def sadd(key, *p):
       try:
          super(redis.StrictRedis, self).sadd(key, p)
       except:
          ..

但是由于redis有很多命令,我必须逐个扭曲它们。

是否可以为类定制异常处理程序来处理来自此类的所有异常?

2 个答案:

答案 0 :(得分:1)

默认情况下,所有异常都可能是最糟糕的事情。

无论如何,对于您的问题,您可以编写一个只重定向到连接对象的通用包装器。

class ReddisWrapper(object):

    conn = conn # Here your reddis object

    def __getattr__(self, attr):

         def wrapper(*args, **kwargs):
             # Get the real reddis function
             fn = getattr(self.conn, attr)

             # Execute the function catching exceptions
             try:
                  return fn(*args, **kwargs)

             # Specify here the exceptions you expect                 
             except:
                  log(...)

         return wrapper

然后你会这样打电话:

reddis = ReddisWrapper()
reddis.do_something(4)

尚未经过测试,仅适用于方法。对于属性,您应该捕获不可调用的异常并做出正确的反应。

答案 1 :(得分:0)

它总是相同的Exception吗?

如果是这样,您可以编写自定义,异常捕获和日志记录装饰器。

如下所示:

def exception_catcher(fn):
    try:
        fn()
    except Exception as e:
        log(e)

然后只需在代码中使用它:

@exception_catcher
sadd('s', *array)

@idanshmu建议的评论和Exceptions for the whole class链接将提供更详细的处理每种方法的Exceptions