我知道这是一个奇怪的问题,可能没有答案。 在捕获异常并执行了except块后,我正在尝试执行try块的其余部分。
示例:
[...]
try:
do.this()
do.that()
[...]
except:
foo.bar()
[...]
do.this()
提出由foo.bar()
管理的异常,然后我想执行do.that()
中的代码。我知道没有GOTO声明,但可能是某种黑客攻击或解决方法!
谢谢!
答案 0 :(得分:5)
try... except...
块捕获一个异常。这就是它的用途。它执行try中的代码,如果引发异常,则在except中处理它。你不能在try中提出多个异常。
这是故意的:构建的重点是您需要显式来处理发生的异常。回到try
的末尾会违反此规则,因为except
语句会处理多个内容。
你应该这样做:
try:
do.this()
except FailError:
clean.up()
try:
do.that()
except FailError:
clean.up()
以便明确处理您提出的任何异常。
答案 1 :(得分:2)
使用finally块?我错过了什么吗?
[...]
try:
do.this()
except:
foo.bar()
[...]
finally:
do.that()
[...]
答案 2 :(得分:1)
如果您总是需要执行foo.bar()
,为什么不在try / except块之后移动它?或者甚至是finally:
块。
答案 3 :(得分:1)
一种可能性是以一种方式编写代码,以便在错误条件解决后可以重新执行它,例如:
while 1:
try:
complex_operation()
except X:
solve_problem()
continue
break
答案 4 :(得分:1)
fcts = [do.this, do.that]
for fct in fcts:
try:
fct()
except:
foo.bar()
答案 5 :(得分:0)
您需要两个try块,一个用于当前try块中的每个语句。
答案 6 :(得分:0)
这不能很好地扩展,但对于较小的代码块,您可以使用经典的有限状态机:
states = [do.this, do.that]
state = 0
while state < len(states):
try:
states[state]()
except:
foo.bar()
state += 1
答案 7 :(得分:0)
这是另一种选择。使用回调处理错误情况,以便在解决问题后可以继续。回调基本上包含与except
块中的代码完全相同的代码。
作为一个愚蠢的例子,假设您要处理的异常是一个丢失的文件,并且您有办法处理该问题(默认文件或其他)。 fileRetriever
是知道如何处理问题的回调。然后你会写:
def myOp(fileRetriever):
f = acquireFile()
if not f:
f = fileRetriever()
# continue with your stuff...
f2 = acquireAnotherFile()
if not f2:
f2 = fileRetriever()
# more stuff...
myOp(magicalCallback)
注意:我从未在实践中看到过这种设计,但在特定情况下,我猜它可能有用。