KeyError 中错误消息的新行 - Python 3.3
Posted
技术标签:
【中文标题】KeyError 中错误消息的新行 - Python 3.3【英文标题】:New line on error message in KeyError - Python 3.3 【发布时间】:2018-04-04 04:08:59 【问题描述】:我通过 IDLE 使用 Python 3.3。在运行如下代码时:
raise KeyError('This is a \n Line break')
它输出:
Traceback (most recent call last):
File "test.py", line 4, in <module>
raise KeyError('This is a \n Line break')
KeyError: 'This is a \n Line break'
我希望它输出带有换行符的消息,如下所示:
This is a
Line Break
我曾尝试在之前或使用 os.linesep 之前将其转换为字符串,但似乎没有任何效果。有什么办法可以强制消息在 IDLE 上正确显示?
如果我提出Exception
(而不是KeyError
),那么输出就是我想要的,但如果可能的话,我仍然想提出KeyError
。
【问题讨论】:
请注意我写的是“上面”,即消息显示为“这是一个\n换行符”,而不是我期望的“下面”与新行。 【参考方案1】:您的问题与 IDLE 无关。你看到的行为都来自 Python。从命令行以交互方式运行当前存储库 CPython,我们会看到您报告的行为。
Python 3.7.0a2+ (heads/pr_3947:01eae2f721, Oct 22 2017, 14:06:43)
[MSC v.1900 32 bit (Intel)] on win32
>>> raise KeyError('This is a \n Line break')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'This is a \n Line break'
>>> s = 'This is a \n Line break'
>>> s
'This is a \n Line break'
>>> print(s)
This is a
Line break
>>> raise Exception('This is a \n Line break')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Exception: This is a
Line break
>>> raise IndexError(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: This is a
Line break
>>> try:
... raise KeyError('This is a \n Line break')
... except KeyError as e:
... print(e)
'This is a \n Line break'
>>> try:
... raise KeyError('This is a \n Line break')
... except KeyError as e:
... print(e.args[0])
This is a
Line break
我不知道为什么 KeyError 的行为甚至与 IndexError 不同,但打印 e.args[0] 应该适用于所有异常。
编辑
this old tracker issue中给出了差异的原因,其中引用了KeyError
源代码中的注释:
/* If args is a tuple of exactly one item, apply repr to args[0]. This is done so that e.g. the exception raised by [''] prints KeyError: '' rather than the confusing KeyError alone. The downside is that if KeyError is raised with an explanatory string, that string will be displayed in quotes. Too bad. If args is anything else, use the default BaseException__str__(). */
此部分出现在 Python 源代码的 Objects/exceptions.c
中的 KeyError_str
对象定义中。
我将提到您的问题作为这种差异的另一种表现。
【讨论】:
有趣的是,它只发生在 KeyError 上,而不是 ValueError 或任何东西上【参考方案2】:有一种方法来获得你想要的行为:只需继承 str
并覆盖 __repr__
:
class KeyErrorMessage(str):
def __repr__(self): return str(self)
msg = KeyErrorMessage('Newline\nin\nkey\nerror')
raise KeyError(msg)
# Prints:
# Traceback (most recent call last):
# ...
# File "<ipython-input-2-dab072137773>", line 5, in <module>
# raise KeyError(msg)
# KeyError: Newline
# in
# key
# error
【讨论】:
以上是关于KeyError 中错误消息的新行 - Python 3.3的主要内容,如果未能解决你的问题,请参考以下文章
使用 youtube API 返回 youtube livechat 消息的 Python 脚本会在一段时间后返回奇怪的 KeyError 和 NoneType 错误
使用 DictReader 访问 CSV 的第三列时出现 KeyError [重复]
Pandas json_normalize 会产生令人困惑的“KeyError”消息?