67

我正在按照以下内容编写,在比较两个多行 Unicode 文本块时,我尝试生成一个体面的错误消息。进行比较的内部方法提出了一个断言,但默认解释对我来说没用

我需要在代码中添加一些内容,如下所示:

def assert_long_strings_equal(one, other):
    lines_one = one.splitlines()
    lines_other = other.splitlines()
    for line1, line2 in zip(lines_one, lines_other):
        try:
            my_assert_equal(line1, line2)
        except AssertionError, error:
            # Add some information to the printed result of error??!
            raise

我无法弄清楚如何在我捕获的 assertionerror 中更改打印的错误消息。我总是得到AssertionError: u'something' != 'something else',它只显示输出的第一行。

如何更改断言消息以打印出我想要的任何内容?

如果它是相关的,我正在使用它nose来运行测试。

4

4 回答 4

121
assert expression, info

例如,

>>> assert False, "Oopsie"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: Oopsie

文档

断言语句是将调试断言插入程序的便捷方式:

assert_stmt ::=  "assert" expression
["," expression] 

简单形式 , assert expression等价于

if __debug__:
    if not expression:
        raise AssertionError 

扩展形式

assert expression1, expression2

相当于

if __debug__:
    if not expression1:
        raise AssertionError(expression2)

这些等价假设 __debug__AssertionError引用具有这些名称的内置变量。在当前实现中,内置变量__debug__在正常情况下为True,在请求优化时为False(命令行选项-O)。当前代码生成器在编译时请求优化时不会为断言语句发出代码。请注意,错误消息中不必包含失败表达式的源代码;它将显示为堆栈跟踪的一部分。

于 2010-09-27T21:34:10.353 回答
68

使用e.args,e.message已弃用。

try:
    assert False, "Hello!"
except AssertionError as e:
    e.args += ('some other', 'important', 'information', 42)
    raise

这保留了原始回溯。它的最后一部分看起来像这样:

AssertionError: ('Hello!', 'some other', 'important', 'information', 42)

适用于 Python 2.7 和 Python 3。

于 2013-02-27T11:54:49.520 回答
5

您想获取捕获的异常,将其转换为字符串,将其与一些额外的字符串信息结合起来,然后引发新的异常。

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )
于 2010-09-27T22:46:20.137 回答
4

您可以在创建异常时传递所需的消息。

raise AssertionError(line1 + ' != ' + line2)

希望这可以帮助。

于 2010-09-27T20:52:34.320 回答