执行(部分)尝试块后除块

时间:2010-11-19 14:26:38

标签: python exception-handling

我知道这是一个奇怪的问题,可能没有答案。 在捕获异常并执行了except块后,我正在尝试执行try块的其余部分。

示例:

[...]
try:
 do.this()
 do.that()
 [...]
except:
 foo.bar()
[...]

do.this()提出由foo.bar()管理的异常,然后我想执行do.that()中的代码。我知道没有GOTO声明,但可能是某种黑客攻击或解决方法!

谢谢!

8 个答案:

答案 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)

注意:我从未在实践中看到过这种设计,但在特定情况下,我猜它可能有用。