gpt4 book ai didi

python - 在 ContextManager 中捕获异常?

转载 作者:太空宇宙 更新时间:2023-11-03 21:38:42 26 4
gpt4 key购买 nike

是否可以在上下文管理器中捕获异常?

背景:方法 get_data_from_remote_system() 每五分钟连接到远程系统并获取数据。

有时网络会关闭。

我想将异常消息抑制 30 分钟。 30 分钟后我想查看异常情况。

我不想捕获所有异常。一些。在本例中socket.timeout

有没有办法编写一个实现此功能的联系人管理器,并且该上下文管理器的最终用法如下所示?

with suppress_exception(exceptions=[socket.timeout], minutes=30):
get_data_from_remote_system()

最佳答案

是的,我不知道如果您在 __exit__() 中返回 True,则不会引发异常。

现在 suppress_exception() 上下文管理器很简单:

class suppress_exception(object):
def __init__(self, exceptions_to_catch, minutes=30):
self.exceptions_to_catch = exceptions_to_catch
self.timedelta = datetime.timedelta(minutes=minutes)
code = sys._getframe().f_back.f_code
self.cache_key = 'suppress_exception_' + code.co_filename + str(sys._getframe().f_back.f_lineno)

def __enter__(self):
return self

def __exit__(self, type, value, traceback):
datetime_of_first_failure = cache.get(self.cache_key)
now = datetime.datetime.now()
if not type:
cache.delete(self.cache_key)
if datetime_of_first_failure:
logging.info('Fine again. First failure was %s. Duration (first failure until ok): %s' % (
datetime_of_first_failure, now - datetime_of_first_failure))
return
if not issubclass(type, self.exceptions_to_catch):
# Thils will raise an exception
return
if not datetime_of_first_failure:
cache.set(self.cache_key, now)
datetime_of_first_failure = now
log_method = logging.warn
if datetime_of_first_failure + self.timedelta > now:
log_method = logging.info
log_method('%s %s (datetime_of_first_failure=%s)' % (type.__name__, value, datetime_of_first_failure))
return True

关于python - 在 ContextManager 中捕获异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53066452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com