Python 2.7异常不处理python3兼容代码中的unicode(&#39; <exception str()=“”failed =“”>&#39;)

时间:2017-09-06 13:13:48

标签: python-2.7 python-3.x python-unicode

我试图拥有python2.7 / 3 +兼容代码。而且我正在努力处理正确地使用unicode中的消息引发ValueError。我发现&#34;异常str()失败&#34;。

的结果非常少

以下是代码:

from __future__ import (
    absolute_import, division, print_function, unicode_literals
)

import logging

from builtins import str
from future import standard_library

standard_library.install_aliases()

conf = {}
try:
    conf["key"]
except KeyError:
    msg = "Message"
    msg += " + ünicode"
    logging.warn(msg)
    raise ValueError(msg)

在python3中,这是按预期工作的,但是在python 2.7中,只要msg包含unicode,就会给出:

WARNING:root:Message + ünicode
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
ValueError: <exception str() failed>

注意日志记录如何处理unicode字符串而不是ValueError。我究竟做错了什么 ?如何在python 2.7和3+中都有unicode错误消息?

1 个答案:

答案 0 :(得分:2)

您可以尝试对msg进行编码,将其转换为Python 2的字符串,例如

from sys import version_info

if version_info.major == 2:
    raise ValueError(msg.encode('utf-8'))
elif version_info.major == 3:
    raise ValueError(msg)
else:
    raise YourException("not supported Python version")

Upate:如果您只使用from __future__ import unicode_literals而不使用python-future包,则以下是无需导入任何包的解决方法:

if isinstance(msg, str):
   raise ValueError(msg)
else:
   raise ValueError(msg.encode('utf-8'))

等待来自Python代码级别的补丁(例如六个,未来的包)几乎是不可能的,因为有问题的代码在pythonrun.c中的C代码级别,似乎PyObject_Str(value)执行unicode字符串返回null