如何更改Python AssertionError中的消息?

时间:2010-09-27 20:43:13

标签: python exception assertions nose

我正在编写以下内容,在比较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: u'something' != 'something else',它只显示输出的第一行。

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

如果相关,我使用nose来运行测试。

5 个答案:

答案 0 :(得分:68)

assert expression, info

例如,

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

来自docs

  

断言语句是一种方便的方法   将调试断言插入到   程序:

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__是   在正常情况下是真的,错误   何时请求优化   (命令行选项-O)。目前   代码生成器不会发出代码   优化时断言语句   在编译时请求。注意   没有必要包括   表达式的源代码   错误消息中失败;它会   显示为堆栈的一部分   跟踪。

答案 1 :(得分:47)

使用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。

答案 2 :(得分:5)

您希望获取捕获的异常,将其转换为字符串,将其与一些其他字符串信息组合,并引发新的异常。

x = 3
y = 5
try:
    assert( x == y )
except AssertionError, e:
    raise( AssertionError( "Additional info. %s"%e ) )

答案 3 :(得分:5)

使用这种方法,我能够编辑消息,并且仍然可以看到堆栈跟踪(+任何其他信息)。此外,还会显示新行。

try:
   my_assert_equal(line1, line2)
except AssertionError as e:
   message = e.args[0]
   message += "\nThis appends the default message and can have newlines"
   e.args = (message,) #wrap it up in new tuple
   raise

答案 4 :(得分:2)

您可以在创建例外时传递所需的消息。

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

希望这有帮助。