Python嵌入式异常处理

时间:2012-12-17 21:06:17

标签: python exception

我在下面有一个代码示例,我想要捕获一些异常:

在主要功能中:

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

2 个答案:

答案 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

因此,没有必要处理'未被函数捕获的异常'; 需要处理之前尚未捕获的异常。