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 比我更好。
为什么以下单元测试会失败,如何让我的上下文管理器正确传递异常?我正在使用 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 比我更好。