![](/img/trans.png)
[英]Using a Try and Except block, but in the Except Part it says Not Defined Python
[英]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.