如何在python中重复异常?

Jas*_*nTS 6 python python-2.7

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

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

try:
  do_some_database_stuff()
except DatabaseTimeoutException:
  reconnect_to_database()
  do_some_database_stuff() # just do it again
Run Code Online (Sandbox Code Playgroud)

但想象一下,如果我没有一个很好的功能,而是很多代码.重复的代码不是很好.

所以我认为这稍微好一些:

while True:
  try:
    do_some_database_stuff()
    break
  except DatabaseTimeoutException:
    reconnect_to_database()
Run Code Online (Sandbox Code Playgroud)

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

i = 0
while i < 5:
  try:
    do_some_database_stuff()
    break
  except DatabaseTimeoutException:
    reconnect_to_database()
    i += 1
Run Code Online (Sandbox Code Playgroud)

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

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

你可以看到它开始变得非常混乱.

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

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

Joh*_*nck 6

您可以使用" for-else "循环:

for ii in range(5):
    try:
        do_some_database_stuff()
        break
    except DatabaseTimeoutException:
        reconnect_to_database()
else:
    raise DatabaseTimeoutException
Run Code Online (Sandbox Code Playgroud)

或者,没有:

for ii in range(5):
    try:
        do_some_database_stuff()
        break
    except DatabaseTimeoutException:
        if ii == 4:
            raise
        reconnect_to_database()
Run Code Online (Sandbox Code Playgroud)