python context manager not passing exceptions
为什么以下单元测试失败,如何让我的上下文管理器正确传递异常? 我正在使用python 3。
test.py:
1 2 3 4 5 | class test(object): def __enter__(self): pass def __exit__(self, *args): return args |
test_test.py:
1 2 3 4 5 6 7 8 9 10 11 12 | 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 2 | def __exit__(self, ex_type, ex_val, tb): return ex_type, ex_val, tb |
如果发生任何溢出错误,只需将其更改为不返回任何内容或引发错误。 如果返回任何truthy值,则上下文块会抑制错误。 你需要返回false。 一个例子如下:
1 2 3 4 | def __exit__(self, ex_type, ex_val, tb): if ex_type is OverflowError: return False return True |
编辑Martijn Pieters一如既往地有比我更好的解释。