python - 如何在 python 中出现异常时重复某些内容?

标签 python python-2.7

在 python 中导致异常后重复某事的最优雅方法是什么?

我有这样的东西[以伪代码为例]:

try:
  do_some_database_stuff()
except DatabaseTimeoutException:
  reconnect_to_database()
  do_some_database_stuff() # just do it again

但是想象一下,如果我没有一个很好的函数,而是有很多代码。重复的代码不是很好。

所以我觉得这样稍微好一点:

while True:
  try:
    do_some_database_stuff()
    break
  except DatabaseTimeoutException:
    reconnect_to_database()

如果异常确实解决了问题,那就足够了。如果不是,我需要一个计数器来防止无限循环:

i = 0
while i < 5:
  try:
    do_some_database_stuff()
    break
  except DatabaseTimeoutException:
    reconnect_to_database()
    i += 1

但后来我真的不知道它是否有效所以它也是:

while i <= 5:
  try:
    do_some_database_stuff()
    break
  except DatabaseTimeoutException:
    if i != 5:
     reconnect_to_database()
    else:
      raise DatabaseTimeoutException
    i += 1

如您所见,它开始变得非常困惑。

表达这种逻辑的最优雅的方式是什么?

  • 尝试一下
  • 如果失败,应用修复
  • 再试 n 次,包括修复
  • 如果它继续失败给我一个错误以防止无限循环

最佳答案

您可以使用“for-else”循环:

for ii in range(5):
    try:
        do_some_database_stuff()
        break
    except DatabaseTimeoutException:
        reconnect_to_database()
else:
    raise DatabaseTimeoutException

或者,没有:

for ii in range(5):
    try:
        do_some_database_stuff()
        break
    except DatabaseTimeoutException:
        if ii == 4:
            raise
        reconnect_to_database()

关于python - 如何在 python 中出现异常时重复某些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26794352/

相关文章:

python - sklearn 中每个类(class)的具体测试数量/训练规模

python - 使用 Python 在 Postgres 中参数化查询

python - 如何在退出框架上获取MessageDialog?

python - 如何在Python爬虫中访问多页面表单的发布数据

python - sorl-thumbnail 的模板标签什么都不做

python - 在 Python 中创建元组范围的最快方法

python - Flask - 蓝图名称发生冲突

postgresql - psycopg2 cursor.execute() 传入变量表名和项

Python Selenium 显式等待

python - 基本的hadoop mapreduce作业正在启动,但尚未完成