当我收到异常 cPickle.UnpicklingError: invalid load key, 'ÿ'.
并尝试打印它时,当我尝试将其插入我的 ( unicode)错误消息:
try:
settings = _load()
except cPickle.UnpicklingError, err:
msg = _(u"Error reading ... (the error is: '%s')")
cont = askYes(msg % err, _(u"Settings Load Error")) # raises
尝试了 msg % unicode(err.message,encoding='utf-8')
中的解决方法,但显然 err.message
不是有效的 unicode 字符串(“UnicodeDecodeError”) : 'utf8' 编解码器无法解码位置 19 中的字节 0xff:无效起始字节")
那么处理这个问题最Pythonic的方法是什么?我应该将“忽略”或“替换”传递给 unicode()
吗?
编辑:askYes(None, msg % repr(err), _(u"Settings Load Error"))
给出类似以下内容:
(the error is: 'UnpicklingError("invalid load key, '\xff'.",)'). # ff is ÿ
不吹但仍然...
Edit2:我报告的错误与人为错误有点混淆:
u'%s' % "cPickle.UnpicklingError: invalid load key, 'ÿ'."
Traceback (most recent call last):
File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 44: ordinal \
not in range(128)
这是来自 pycharm 内部的解释器 - 显然 ÿ
是 '\xc3\xbf'
(...)
最佳答案
确保您可以在错误消息中看到结果的一种方法是使用 repr
,或者更直接 %r
而不是%s
:永远不会失败(因为任何对象都有一个表示,并且所有表示都是 ASCII 格式,包括可能的转义序列),并且还显示(作为转义序列)否则可能不可见的字符。
repr
(以及旧式格式字符串中的 '%r'
)委托(delegate)给对象类型的 __repr__
特殊方法;每个对象类型负责知道如何用明确的(不一定是 super 可读的)ASCII 字符串最好地表示自己。字符串和字节序列尤其擅长这一点,因此 repr
super 适合他们。
OP 已经做到了这一点,但不喜欢结果的美观(在 repr
的 err.message
与 repr
的 err
之间变化)。不幸的是,对于repr
来说,美观是最不重要的。 :相反,这都是关于完整、明确的信息。
另一个想法是使用永不失败的编码进行解码(解码每个字节,尽管可能解码为上下文中无意义的字形),例如“iso-8859-1”。但这并没有比repr
有真正的改进。 , 我相信;审美上的提升颇值得商榷,在“完整、明确的信息”方面存在损失的可能性。
关于Python,UnicodeDecodeError 尝试打印包含非 ascii 字符的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27652804/