python上下文管理器不传递异常

时间:2017-06-30 06:18:43

标签: python exception contextmanager

为什么以下单元测试失败,如何让我的上下文管理器正确传递异常?我正在使用python 3。

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 个答案:

答案 0 :(得分: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

编辑 Martijn Pieters总是比我更好explanation