python:如果finally块引发异常,则从try块恢复异常

时间:2012-04-20 14:43:41

标签: python exception exception-handling try-catch try-catch-finally

说我有这样的代码:

try:
    try:
        raise Exception("in the try")
    finally:
        raise Exception("in the finally")
except Exception, e:
    print "try block failed: %s" % (e,)

输出结果为:

try block failed: in the finally

从print语句的角度来看,有没有办法访问try中引发的异常,还是它永远消失了?

注意:我没有考虑用例;这只是好奇心。

2 个答案:

答案 0 :(得分:14)

我找不到任何关于这是否已被移植并且没有方便Py2安装的信息,但在Python 3中,e有一个名为e.__context__的属性,因此: / p>

try:
    try:
        raise Exception("in the try")
    finally:
        raise Exception("in the finally")
except Exception as e:
    print(repr(e.__context__))

给出:

Exception('in the try',)

根据PEP 3314,在添加__context__之前,有关原始例外的信息不可用。

答案 1 :(得分:0)

try:
    try:
        raise Exception("in the try")
    except Exception, e:
        print "try block failed"
    finally:
        raise Exception("in the finally")
except Exception, e:
    print "finally block failed: %s" % (e,)

但是,避免使用可能在finally块中引发异常的代码是个好主意 - 通常你只是用它来进行清理等等。