我怎么能做这样的事呢
我相信我必须使用try
,但我还没有完全知道如何在这个特定的例子中使用它。
答案 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()