我试图在python2.7.x中引发异常,该异常在消息中包含unicode。我好像做不到。在
不支持还是不建议在error msg中包含unicode? 或者我需要看一下吗系统标准?在
# -*- coding: utf-8 -*-
class MyException(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return self.value
def __repr__(self):
return self.value
def __unicode__(self):
return self.value
desc = u'something bad with field \u4443'
try:
raise MyException(desc)
except MyException as e:
print(u'Inside try block : ' + unicode(e))
# here is what i wish to make work
raise MyException(desc)
运行脚本将生成以下输出。 在我的尝试/除了我可以打印字符串没有问题。在
我的问题不在考虑范围之内。在
^{pr2}$提前谢谢。在
这就是Python的工作原理。我相信您看到的是来自Python核心库中的
traceback._some_string()
。在该模块中,当堆栈跟踪完成时,该方法中的代码首先尝试使用str()
转换消息,然后如果这引发异常,则使用unicode()
转换消息,然后使用encode("ascii", "backslashreplace")
将其转换为ascii。您得到了有效的输出,并且一切都正常工作,我猜Python正在尽最大努力将错误消息伪向下转换,这样无论平台执行它,它都会毫无问题地显示出来。这只是你角色的unicode码位。它不会发生在您的try/except
块中,因为这种转换是特定于生成堆栈跟踪的机制的(例如在发生未捕获异常的情况下)。在这种行为取决于Python版本和环境。在Python 3上,
sys.stderr
的字符编码错误处理程序总是'backslashreplace'
:Python3:
^{2}$python2:
在我的系统上,错误信息被python2吃掉了。在
注意:在Windows上,您可以尝试:
作为比较:
在我的例子中,您的示例可以正常工作,打印出漂亮的unicode。在
但是,有时在不使用unicode字符(或使用转义/反斜杠)打印异常堆栈时会遇到很多问题。可以克服障碍并打印正常的消息。在
输出问题示例(Python 2.7,linux):
它将只打印截断或拧紧的消息:
^{2}$要实际查看未更改的unicode,可以将其编码为原始字节并馈送到异常对象:
这次您将看到完整的消息:
如果您愿意,您可以在构造函数中执行
value.encode('utf-8', 'replace')
,但是除了系统异常,您必须在raise
语句中执行,如示例所示。在提示是从这里得到的:Overcoming frustration: Correctly using unicode in python2(有一个包含许多helper的大库,它们都可以被分解到上面的示例中)。在
相关问题 更多 >
编程相关推荐