sys.exc_info() の動作は、python docsとSOおよびSOで次のように説明されています。
- 例外ブロックまたは例外ブロックによって呼び出されるメソッド内で、例外を説明するトリプル
- それ以外の場合は、None 値のトリプル
では、なぜこのノーズテストは失敗するのでしょうか?
def test_lang_stack(self):
try:
self.assertEquals((None,None,None), sys.exc_info()) # no exception
a = 5 / 0
except:
self.assertNotEquals((None,None,None), sys.exc_info()) # got exception
else:
self.fail('should not get here')
#finally:
# self.assertEquals((None,None,None), sys.exc_info()) # already handled, right?
self.assertEquals((None,None,None), sys.exc_info()) # already handled, right?
最後の行で失敗します。finally ブロックのコメントを外すと、代わりにそこで失敗します。
これらすべてを 1 つのメソッド内に配置して別のメソッドから呼び出すと、呼び出し元のメソッドに例外が表示されないことがわかります。exc_info 値は、例外が処理された後でも、例外がスローされるメソッドの最後に設定されたままのようです。
OSXでpython2.7を使用しています。