【问题标题】:How to change the message in a Python AssertionError?如何更改 Python AssertionError 中的消息?
【发布时间】:2011-04-17 23:40:47
【问题描述】:

我正在编写以下内容,在比较两个多行 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 运行测试。

【问题讨论】:

  • 澄清一下,我意识到捕获断言错误很奇怪。碰巧my_assert_equal有点深,我不想惹它。
  • 只是指出,你应该有except而不是catch。虽然我确定这只是一个错字:p

标签: python exception assertions nose


【解决方案1】:

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

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

希望这会有所帮助。

【讨论】:

  • 这不是 OP 的意思; AssertionError (通常)由assert 声明提出。
  • 我不确定...但如果用 if 语句包裹而不是使用 assert 可能是可以接受的。这样,您可以使用 if else 块并使用自定义消息回退到 AssertionError。
【解决方案2】:
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)。目前的 代码生成器不为 优化时的断言语句 在编译时请求。注意 没有必要包括 表达式的源代码 错误消息中失败;它会 显示为堆栈的一部分 跟踪。

【讨论】:

  • 请注意,您还可以在info 字符串表达式中嵌入换行符,以使它们在显示时看起来不错。
  • 另请注意,您可以使用 Python 的字符串插值和更新的字符串格式化操作向字符串表达式添加其他信息。
  • 引发异常通常不是问题。我问的是捕捉、修改和重新提升一个表情。
  • @Andres -- 你应该编辑问题以明确地说出来......我不把这个问题解释为这样说。
  • 敲打额头。现在很清楚为什么assert(condition, message) 会以始终正确的警告中断:assert 是运算符而不是函数,因此该语句会测试一个元组。而是assert condition message
【解决方案3】:

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

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

【讨论】:

  • 我没有看到任何已发布的答案提供了如何向异常添加信息并使用原始信息和附加信息重新提出的一般解决方案,我认为这是 OP 的内容问。
  • Russel 是对的,这就是我一直在寻找的东西。
【解决方案4】:

使用e.argse.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.7 上尝试时,这只会引发类型错误。
  • 哪种类型的错误?我在写答案时使用的是 2.7。
  • @philogon 我刚刚在 Python 2.7.10 和 Python 3.5.1 中尝试了解决方案(我的答案的精确复制粘贴),它按预期工作。我的回答被否决了,但我不明白为什么。
  • @Honza Javorek 不错的解决方案,但可能有一些图书馆在线?
  • @matanster 与 print 不同,assert 仍然是 Python 3 中的语句 docs.python.org/3/reference/…
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多