5

sys.exc_info() の動作は、python docsSOおよび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を使用しています。

4

2 に答える 2

2

assertEquals() と assertNotEquals() の両方で、次を呼び出す必要があります。

sys.exc_clear()

これにより、次のエラーに備えることができます。

于 2013-06-07T03:21:29.537 に答える