如果在Python中异常重试

时间:2015-08-16 21:54:52

标签: python try-catch conditional

我怎么能做这样的事呢

  1. 尝试做点什么。
  2. 如果有效,那就好了,继续正常流动。
  3. 如果失败则运行一个功能并重试。
  4. 如果它再次失败则抛出异常并停止代码。
  5. 我相信我必须使用try,但我还没有完全知道如何在这个特定的例子中使用它。

4 个答案:

答案 0 :(得分:2)

尝试嵌套try catch

try:
    do_something() #if this works, will skip rest and continue
except:
    do_fix_function() #on error, do extra function
    try:
        do_something() #try again
    except:
        throw error() #if it fails this time, stop and throw an error

请注意,如果您的do_fix_function()也可能失败,您可能希望将其放在第二个try语句中

答案 1 :(得分:2)

这适用于任意数量的尝试;我把它设置为两个,因为那就是你想要的。

tries = 2
while True:
    try:
        step1()
    except CatchThisException:
        tries -= 1
        if tries:  # if tries != 0
            step3()
            continue  # not necessary, just for clarity
        else:
            raise  # step 4
    else:
        break  # step 2

答案 2 :(得分:2)

听起来你根本不想做嵌套的try-catch。 Exceptions as control flow are a gnarly anti-pattern,以及您可以避免的地方,应该

在这种情况下,避免很容易。在您描述的方法中,您希望在对文件执行某些操作之前确保该文件存在。你也有一个方法来纠正"不应该走的路。如果两次尝试都失败了,那么你想要摆脱困境。

考虑到这一点,我们希望使用os.path.isfile

from os.path import isfile

def something(filepath):
    # Don't mutate the parameter if you can help it.
    p = filepath
    if not isfile(p):
        p = correct_path(p)
        if not isfile(p):
            raise Error("Cannot find file {} after correction to {}, aborting.".format(filepath, p))
    with open(p, 'r') as f:
        # Rest of file operations here

答案 3 :(得分:-1)

您可以使用retrying package解决重试尝试。只需编写一段代码,该代码将在失败时不断重复,直到达到最大重试次数为止

例如:

随机导入 重试导入重试

@retry
def do_something_unreliable():
    if random.randint(0, 10) > 1:
        raise IOError("Broken sauce, everything is hosed!!!111one")
    else:
        return "Awesome sauce!"

print do_something_unreliable()