Python 2.7 异常不处理 python3 兼容代码中的 unicode ('<exception str() failed>')
Python 2.7 exception do not handle unicode in python3 compatible code ('<exception str() failed>')
我正在尝试使用 python2.7/3+ 兼容代码。而且我正在努力处理正确地使用 unicode 中的消息引发 ValueError。我发现 "exception str() failed".
的结果很少
代码如下:
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 错误消息?
您可以尝试对 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")
更新:如果您只使用 from __future__ import unicode_literals
而没有 python-future 包,下面是不导入任何包的解决方法:
if isinstance(msg, str):
raise ValueError(msg)
else:
raise ValueError(msg.encode('utf-8'))
等待 Python 代码级别的补丁(例如 6,未来的软件包)几乎是不可能的,因为有问题的代码在 pythonrun.c 中的 C 代码级别,看起来像 PyObject_Str(value)
unicode 字符串的执行返回 null
我正在尝试使用 python2.7/3+ 兼容代码。而且我正在努力处理正确地使用 unicode 中的消息引发 ValueError。我发现 "exception str() failed".
的结果很少代码如下:
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 错误消息?
您可以尝试对 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")
更新:如果您只使用 from __future__ import unicode_literals
而没有 python-future 包,下面是不导入任何包的解决方法:
if isinstance(msg, str):
raise ValueError(msg)
else:
raise ValueError(msg.encode('utf-8'))
等待 Python 代码级别的补丁(例如 6,未来的软件包)几乎是不可能的,因为有问题的代码在 pythonrun.c 中的 C 代码级别,看起来像 PyObject_Str(value)
unicode 字符串的执行返回 null