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

python context manager not passing exceptions

为什么以下单元测试会失败,如何让我的上下文管理器正确传递异常?我正在使用 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。为什么会发生这种情况,我需要做什么才能使我的上下文管理器正确传播异常?

您的问题在这里:

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

__exit__ 的 return 值表示您想抑制在上下文块中引发的那些错误。

只需将其更改为return nothing 或在发生任何溢出错误时引发错误。如果任何真值被 returned,上下文块会抑制错误。你需要return false。举例如下:

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

编辑 Martijn Pieters 一如既往地explanation 比我更好。