我想用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有很多命令,我必须逐个扭曲它们。
是否可以为类定制异常处理程序来处理来自此类的所有异常?
答案 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
。