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

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

__exit__的返回值意味着您要抑制在上下文块中引发的那些错误。

如果发生任何溢出错误,只需将其更改为不返回任何内容或引发错误。 如果返回任何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一如既往地有比我更好的解释。