14

次のようなコードがあるとします。

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 で発生した例外にアクセスする方法はありますか、それとも永遠に消えてしまったのでしょうか?

注: 使用例は考えていません。これはただの好奇心です。

4

2 に答える 2

14

これがバックポートされたかどうかについての情報を見つけることができず、Py2 インストールが便利ではありませんが、Python 3 にeは という属性があるe.__context__ため、次のようになります。

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__に、元の例外に関する情報は入手できませんでした。

于 2012-04-20T14:52:13.963 に答える
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ブロックで例外をスローする可能性のあるコードを使用しないようにすることをお勧めします。通常は、とにかくクリーンアップなどを行うために使用します。

于 2012-04-20T14:45:46.333 に答える