【发布时间】:2011-10-31 11:08:38
【问题描述】:
例如
try:
foo()
bar()
except:
pass
当 foo 函数抛出异常时,如何跳到下一行(bar)并执行?
【问题讨论】:
例如
try:
foo()
bar()
except:
pass
当 foo 函数抛出异常时,如何跳到下一行(bar)并执行?
【问题讨论】:
将bar() 移出try 块:
try:
foo()
except:
pass
bar()
顺便说一句,请注意包罗万象的except 子句。倾向于选择性地捕获您知道可以处理/忽略的异常。
【讨论】:
except Exception:,因为它不会捕获KeyboardInterrupt 或SystemExit 之类的东西。所以如果这被困在一个紧密的循环中,你仍然可以用 ^C 打破。
如果对bar 的调用位于try 块内,则无法完成。您必须将调用放在 try-except 块之外,或者使用 else:
try:
foo()
except:
pass
else:
bar()
如果bar 也可能引发异常,您必须为bar 使用单独的try 块。
【讨论】:
如果您只有两个函数 foo() bar(),请检查其他解决方案。如果您需要运行很多行,请尝试以下示例:
def foo():
raise Exception('foo_message')
def bar():
print'bar is ok'
def foobar():
raise Exception('foobar_message')
functions_to_run = [
foo,
bar,
foobar,
]
for f in functions_to_run:
try:
f()
except Exception as e:
print '[Warning] in [{}]: [{}]'.format(f.__name__,e)
结果:
[Warning] in [foo]: [foo_message]
bar is ok
[Warning] in [foobar]: [foobar_message]
【讨论】:
这不是使用 try/except 块的预期方式。如果bar() 应该被执行,即使foo() 失败,你应该把每个都放在它自己的try/except 块中:
try:
foo()
except:
pass # or whatever
try:
bar()
except:
pass # or whatever
【讨论】:
如果您希望两个函数的异常由相同的 except 子句处理,则使用内部 try/finally 块:
try:
try:
foo()
finally:
bar()
except Exception:
print 'error'
如果foo()有异常,先执行bar(),再执行except子句。
但是,将最少量的代码放在 try 块中通常是一种很好的做法,因此最好为每个函数使用单独的异常处理程序。
【讨论】: