Python 在除块之后执行(部分)try块

Python 在除块之后执行(部分)try块,python,exception-handling,Python,Exception Handling,我知道这是一个奇怪的问题,可能没有答案。 我正在尝试在捕获异常并执行except块之后执行try块的其余部分 例如: [...] try: do.this() do.that() [...] except: foo.bar() [...] do.this()引发由foo.bar()管理的异常,然后我想从do.that()执行代码。我知道没有GOTO声明,但可能是某种黑客或变通方法 谢谢 如果您总是需要执行foo.bar()为什么不在try/except块之后移动它呢?或者甚至可能是最后

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

例如:

[...]
try:
 do.this()
 do.that()
 [...]
except:
 foo.bar()
[...]
do.this()
引发由
foo.bar()
管理的异常,然后我想从
do.that()
执行代码。我知道没有GOTO声明,但可能是某种黑客或变通方法


谢谢

如果您总是需要执行
foo.bar()
为什么不在try/except块之后移动它呢?或者甚至可能是最后一个块。

您需要两个try块,当前try块中的每一条语句都有一个try块。

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

while 1:
   try:
      complex_operation()
   except X:
      solve_problem()
      continue
   break

使用最后一个区块?我错过什么了吗

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

A
试试看。。。除了…
块捕获一个异常。这就是它的目的。它在try中执行代码,如果引发异常,则在except中处理它。您不能在try中引发多个异常

这是经过深思熟虑的:构造的要点是您需要显式地处理发生的异常。返回到
try
的末尾违反了这一点,因为
except
语句处理不止一件事

你应该做:

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

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

因此,您提出的任何异常都会被显式处理。

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

states = [do.this, do.that]
state = 0
while state < len(states):
    try:
        states[state]()
    except:
        foo.bar()
    state += 1
states=[do.this,do.that]
状态=0
当状态
这是另一种选择。通过回调处理错误情况,以便在修复问题后可以继续。回调基本上包含与放入
块中的代码完全相同的代码,除了

举个愚蠢的例子,假设您想要处理的异常是一个丢失的文件,并且您有办法处理该问题(一个默认文件或其他)
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)

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

这表明您的设计有问题。如果
do.that
即使在
do.this
引发异常时也可以运行,则它们不应位于同一个try-except块中。你必须提供函数实际执行的信息,这样我们才能提出解决方案。我不需要总是执行foo.bar()。这只是一个例子。我试图做的是在执行Exception之后返回try:块:block@NikoP,如果引发异常,则无法返回到
try
块。但是你可以重新构造你的代码,这样你就不需要了。我知道我不能返回到try块。但是假设我能够在运行时修复do.this()(或该try块中的任何其他操作),我如何恢复执行?仅拆分try/execute块中的每个调用?这样可以重新运行所有try:块。我想从失败指令的下一条指令重新开始执行。这就是为什么我说“以一种可以重新执行的方式编写代码”,例如,不需要重新获取资源的代码,诸如此类的事情。嗯,这只是一个想法。我的问题不清楚。实际上,可以从this()或that()或任何地方引发异常,这并不重要,但关键是以某种方式“返回”到try块。“Return”或以某种方式执行异常后try块中的代码
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)