我正在编写以下内容,在比较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
来运行测试。
答案 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)
希望这有帮助。