2017-06-30 8 views
0

次の単体テストが失敗し、コンテキストマネージャが例外を正しく渡すのはなぜですか?私のpython 3.Pythonコンテキストマネージャ例外を渡さない

test.pyを使用しています:

class test(object): 
    def __enter__(self): 
     pass 
    def __exit__(self, *args): 
     return args 

test_test.py:

import test 
import unittest 

class TestTest(unittest.TestCase): 
    def test_test(self): 

     with self.assertRaises(OverflowError): 
      with test.test(): 
       raise OverflowError() 

if __name__ == '__main__': 
    unittest.main() 

は、ユニットテストを実行すると、私はOverflowErrorをが発生していないといったエラーが発生します。なぜこれが起こり、コンテキストマネージャが例外を適切に伝播するためには何が必要なのでしょうか?

+1

なぜあなたは 'return args'をやっているのですか?あなたは何をすべきだと思いましたか? – user2357112

+0

何とか価値があるとはいえ、何とか私のコンテキストマネージャーの前のバージョンがコンテキスト本体内の 'return'ステートメントの値を食べていると私は確信していました。また何らかの形で、 'return'がその時に正しい振る舞いをするように私のコードを壊したと付け加えます。 –

答えて

1

あなたの問題はここにある:

def __exit__(self, ex_type, ex_val, tb): 
    return ex_type, ex_val, tb 

__exit__の戻り値を使用すると、コンテキストブロック内で上げこれらのエラーを抑制することを意味します。

オーバーフローエラーが発生した場合は、何も戻さないように、またはエラーを発生させるために単に変更してください。 truthy値が返された場合、コンテキストブロックはエラーを抑制します。あなたはfalseを返す必要があります。次のように例を示します。

def __exit__(self, ex_type, ex_val, tb): 
    if ex_type is OverflowError: 
     return False 
    return True 

編集マルタインピータースいつも私よりexplanationより良いを持っているよう。

関連する問題