为类创建的Python自定义异常处理程序

2024-10-02 02:36:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用redis缓存构建我的应用程序。但在我们的案例中,可能redis并不总是可用的,
所以我希望,它的redis工作得很好,我们使用它。如果它不能工作,只需记录并忽略它这次。在

例如:

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

因为有很多地方我会运行一些conn.{rediscommand},所以我不喜欢使用try/except-everyplace。在

所以解决办法可能是:

^{pr2}$

但是由于redis有很多命令,所以我不得不一个一个的修改它们。在

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


Tags: redis应用程序地方记录connarray案例try
2条回答

在默认情况下关闭所有异常可能是你能做的最糟糕的事情。在

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

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

然后你会这样叫:

^{pr2}$

这还没有经过测试,而且只适用于方法。对于属性,您应该捕获不可调用的异常并正确地作出反应。在

它总是一样的Exception?在

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

如下所示:

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

然后在代码中使用它:

^{pr2}$

@idanshmu建议的注释和指向Exceptions for the whole class的链接将为每个方法提供更详细的处理Exceptions。在

相关问题 更多 >

    热门问题