我在下面有一个代码示例,我想要捕获一些异常:
在主要功能中:
try:
...
do_something()
except some_exception,e:
do_some_other_thing
在do_something
函数
try:
...
except some_exception,e:
do_some_other_thing
因此,当我测试时,我注意到异常处理了两次(一次在do_somthing()
,一次在main
函数中),我的观察是否准确?
有没有办法捕获仅仅未被其功能捕获的异常?因为我想捕获两种情况,它们有点包含在同一个异常处理类中(即some_exception
)
答案 0 :(得分:1)
为什么不尝试一下,看一下简单测试会发生什么?
def main():
try:
raise ValueError("in main!")
except ValueError as e:
print "caught exception",str(e)
#for fun, re-run with the next line uncommented and see what happens!
#raise
try:
main()
except ValueError:
print "caught an exception above main"
如果您实际尝试此代码,您会注意到它只打印一条消息(在main
函数内),证明异常一旦被捕获就不会向上传播(除非您重新raise
它在你的除外条款中。)
答案 1 :(得分:1)
您的观察结果不准确;必须有两个提升some_exeption
的地方,或者你明确地重新提升它。
一旦异常被捕获,它就不会被堆叠中较高的其他处理程序捕获。
这是最简单的展示:
>>> try:
... try:
... raise AttributeError('foo')
... except AttributeError as e:
... print 'caught', e
... except AttributeError as e:
... print 'caught the same exception again?', e
...
caught foo
仅调用内部 except
处理程序。另一方面,如果我们重新引发异常,您将看到两个处理程序都打印一条消息:
>>> try:
... try:
... raise AttributeError('foo')
... except AttributeError as e:
... print 'caught', e
... raise e
... except AttributeError as e:
... print 'caught the same exception again?', e
...
caught foo
caught the same exception again? foo
因此,没有必要处理'未被函数捕获的异常'; 仅需要处理之前尚未捕获的异常。