繁体   English   中英

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

[英]Execute (part of) try block after except block

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

例:

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

do.this()引发由foo.bar()管理的异常,然后我想从do.that()执行代码。 我知道没有GOTO声明,但也许某种黑客或解决方法!

谢谢!

try... except...块捕获一个例外。 这就是它的用途。 它执行try中的代码,如果引发异常,则在except中处理它。 你不能在try中引发多个异常。

这是故意的:构造的重点是您需要明确地处理发生的异常。 返回到try的结尾会违反这个,因为那时except语句处理多个东西。

你应该做:

try:
    do.this()
except FailError:
    clean.up()

try:
    do.that()
except FailError:
    clean.up()

这样你提出的任何异常都会被明确处理。

使用finally块? 我错过了什么吗?

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

如果你总是需要执行foo.bar()为什么不在try / except块之后移动它? 或者甚至到finally:阻止。

一种可能性是以一种方式编写代码,以便在错误条件得到解决后可以重新执行它,例如:

while 1:
   try:
      complex_operation()
   except X:
      solve_problem()
      continue
   break
fcts = [do.this, do.that]
for fct in fcts:
    try:
        fct()
    except:
        foo.bar()

您需要两个try块,一个用于当前try块中的每个语句。

这不能很好地扩展,但对于较小的代码块,您可以使用经典的有限状态机:

states = [do.this, do.that]
state = 0
while state < len(states):
    try:
        states[state]()
    except:
        foo.bar()
    state += 1

这是另一种选择。 使用回调处理错误情况,以便在解决问题后可以继续。 回调基本上包含你将在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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM