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