检查 Python 2.7 中是否正确引发异常?

Check that an exception is correctly raised in Python 2.7?

有谁知道如何检查是否正确引发了异常?

我需要可以在 Python 2.7 中运行的东西。以下 'assert' 不是从 Python unittest 库中使用的完全正确的方法:

assert ( a_a0_getinst.add_port("iTCK", ISC.PortType_INPUT) ), "Can't add duplicate port"

我得到的错误是:

Traceback (most recent call last):
  File "test_010_module.py", line 157, in runTest
    a_a0_addinst = a_a0.add_instance( "A00", b_a0 )
  File "/nfs/sc/disks/sc_dteg_2004/users/acheung1/dteg_tools-isc/python/t/ISC.py", line 475, in add_instance
    return _ISC.SharedModule_add_instance(self, name, module)
RuntimeError: Can't add duplicate instance with instance name 'A00' to module 'A_A0'

如果您只是想确保它引发正确类型的异常,您可以使用:

self.assertRaises(RuntimeError, your_function, *args, **kwargs)

在 unittest.TestCase class 中。参见 the docs for assertRaises

如果您还想检查它是否也有正确的错误消息,您可以改用:

self.assertRaisesRegexp(RuntimeError, "error message", your_function_call, *args, **kwargs)

在 unittest.TestCase class 中。这里是 the docs for assertRaisesRegexp.

您也可以将这些作为上下文管理器来执行,在这种情况下您不需要将参数分开:

with self.assertRaises(RuntimeError):
    your_function_call(arg1, arg2)

with self.assertRaisesRegexp(RuntimeError, "error message"):
    your_function_call(arg1, arg2)

如您所述,这些是 Python 2.7 的。对于 Python 3.x,assertRaises 表现相同,但正则表达式称为 assertRegex(没有 p)。

编辑:正如评论中所指出的,这仅在您使用单元测试式测试 classes 时才有效。如果您使用 py.test、it has its own similar methods you can use.