作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找尝试命令的最 pythonic 方式,如果发生错误则捕获并通过运行预备命令然后运行原始命令重试。特别是在我的例子中,我希望将一个表写入数据库,如果抛出“模式不存在”错误则捕获,然后尝试创建一个模式并重试写入表。然后,如果写表再次出错,我不想捕获它。
到目前为止,我已经(示意性地):
try:
write_to_table(table, schema)
except sqlalchemy.exc.ProgrammingError:
create_schema(schema)
write_to_table(table, schema)
这是我想要的,但似乎有点不对劲,可能是因为我在复制 write_to_table()。
那么,执行上述操作最符合 Python 风格的方法是什么?
附言当我说我想重试时,我不想这样:How to retry after exception?
最佳答案
只需创建一个可重用的装饰器!!
def retry(func):
'''
Decorator.
If the decorated function fails with an exception
calls it again after a random interval.
'''
def _retry(*args,**kwargs):
max_retries = 1
for i in range(max_retries):
try:
value = func(*args,**kwargs)
return value
except sqlalchemy.exc.ProgrammingError as e:
print('function:[{}({},{})] Failed with error: {} . Retrying...'.format(func.__name__,str(*args),str(kwargs),str(e)))
time.sleep(random.uniform(1,3))
print("Max_retries({}) exceeded for function {}".format(max_retries,func.__name__))
return _retry
通过使用上述装饰器,您还可以在其中配置重试次数和重试间隔,您可以执行以下操作:
@retry
write_to_table(table, schema)
关于python - 大多数 pythonic 方式尝试,除了,并重试一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58815588/
我是一名优秀的程序员,十分优秀!