20

これらは Python 例外の属性ですが、頭を悩ませています。Python のドキュメントは、これについてはかなり静かに見えます。ドキュメントを見てみましたが、かなり混乱しています。では、この 2 つの違いは何で、どのように使用されるのでしょうか。

編集:その点で__traceback__、もしあれば、それらはどのように関連していますか?

EDIT 3: 私は理解していないと思います__cause__. やっと理解でき__traceback__まし__context__た。attribute_error.__cause__を参照しないのはなぜAttributeError()ですか?

try:
    raise NameError() from OSError
except NameError as name_error:
    print('name_error.__cause__: %s' % repr(name_error.__cause__))
    print('name_error.__context__: %s' % repr(name_error.__context__))
    print('name_error.__traceback__: %s' % repr(name_error.__traceback__))
    try:
        raise AttributeError()
    except AttributeError as attribute_error:
        print('attribute_error.__cause__: %s' % repr(attribute_error.__cause__))
        print('attribute_error.__context__: %s' % repr(attribute_error.__context__))
        print('attribute_error.__traceback__: %s' % repr(attribute_error.__traceback__))
        raise attribute_error from IndexError

これは出力します

name_error.__cause__: OSError()
name_error.__context__: None
name_error.__traceback__: <traceback object at 0x000000000346CAC8>
attribute_error.__cause__: None
attribute_error.__context__: NameError()
attribute_error.__traceback__: <traceback object at 0x000000000346CA88>
Traceback (most recent call last):
  File "C:\test\test.py", line 13, in <module>
    raise attribute_error from IndexError
  File "C:\test\test.py", line 8, in <module>
    raise AttributeError()
AttributeError
4

1 に答える 1

24

__cause__は例外の原因です - 指定された例外により、現在の例外が発生しました。これは直接リンクです。X がこの例外をスローしたため、Y がこの例外をスローする必要があります。

__context__一方、別の例外を処理しようとしているときに現在の例外が発生したことを意味し、この例外が発生したときに処理されていた例外を定義します。これは、他の例外が発生した (したがって、このコードで例外をスローした) という事実 (コンテキスト) を失わないようにするためです。X がこの例外をスローし、処理中に Y もスローされました。

__traceback__スタック (現在のコード行にたどり着くまでにたどられたさまざまなレベルの関数) を示します。これにより、例外の原因を特定できます。__context__特定のバグの原因を見つけるために (潜在的に と併用して) 使用される可能性があります。

于 2012-06-27T23:01:05.840 に答える