Python 2.7 python3兼容代码中的Python 2.7异常不处理unicode(';lt;exception str()失败>;';)

Python 2.7 python3兼容代码中的Python 2.7异常不处理unicode(';lt;exception str()失败>;';),python-2.7,python-3.x,python-unicode,Python 2.7,Python 3.x,Python Unicode,我正在尝试一个python2.7/3+兼容的代码。我正在努力正确处理使用unicode消息引发的ValueError。我发现“异常str()失败”的结果很少 代码如下: from __future__ import ( absolute_import, division, print_function, unicode_literals ) import logging from builtins import str from future import standard_libr

我正在尝试一个python2.7/3+兼容的代码。我正在努力正确处理使用unicode消息引发的ValueError。我发现“异常str()失败”的结果很少

代码如下:

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中,这与预期一样有效,但在Python2.7中,只要
msg
包含unicode,它就会给出:

WARNING:root:Message + ünicode
Traceback (most recent call last):
  File "<stdin>", line 7, in <module>
ValueError: <exception str() failed>
警告:root:Message+ünicode
回溯(最近一次呼叫最后一次):
文件“”,第7行,在
值错误:

注意日志如何处理unicode字符串,而不是
ValueError
。我做错了什么?如何在Python2.7和3+中都显示unicode错误消息?

您可以尝试对消息进行编码,并将其转换为Python2的字符串,例如

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:如果您仅使用来自未来的
导入unicode\u文本,则以下是无需导入任何包的解决方法:


从Python代码级别(例如,six,future package)等待修补程序几乎是不可能的,因为有问题的代码位于中的C代码级别,似乎是
PyObject\u Str(value)
执行unicode字符串返回null

这在python2中工作,但是python3中的消息变成了'ValueError:b'message+\xc3\xbcnicode','然后我们可以放置一个条件子句。看到我的更新答案这是一个很好的解决办法,我只是希望有一个未来的内置。我发现这段代码的实现是在C代码级别,几乎不可能等待一个正式的修复或解决办法,如六个和未来的包。如果有帮助,请向上投票并接受解决方案不起作用,因为当使用future中的unicode_literal和内置的str时,
isinstance(msg,str)
在python 2中是正确的。我用了一个版本。
if isinstance(msg, str):
   raise ValueError(msg)
else:
   raise ValueError(msg.encode('utf-8'))