电话:
deprint(_(u'Error finding icon for %s:') % target.s, traceback=True)
def deprint(*args,**keyargs):
# msg = u''
try:
msg += u' '.join([u'%s'%x for x in args])
except UnicodeError:
# If the args failed to convert to unicode for some reason
# we still want the message displayed any way we can
for x in args:
try:
msg += u' %s' % x
except UnicodeError:
msg += u' %s' % repr(x)
if keyargs.get('traceback',False):
o = StringIO.StringIO(msg)
o.write(u'\n')
traceback.print_exc(file=o)
value = o.getvalue()
try:
msg += u'%s' % value
except UnicodeError:
msg += u'%s' % repr(value)
o.close()
#...
失败:
Traceback (most recent call last):
File "Wrye Bash Launcher.pyw", line 87, in <module>
File "bash\bash.pyo", line 574, in main
File "bash\basher.pyo", line 18921, in InitLinks
File "bash\basher.pyo", line 18291, in InitStatusBar
File "bash\bolt.pyo", line 2470, in deprint
File "StringIO.pyo", line 271, in getvalue
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 37: ordinal not in range(128)
对于具有法语区域设置的用户。
版本中的第2470行对应于value = o.getvalue()
。在StringIO中:
def getvalue(self):
"""
Retrieve the entire contents of the "file" at any time before
the StringIO object's close() method is called.
The StringIO object can accept either Unicode or 8-bit strings,
but mixing the two may take some care. If both are used, 8-bit
strings that cannot be interpreted as 7-bit ASCII (that use the
8th bit) will cause a UnicodeError to be raised when getvalue()
is called.
"""
_complain_ifclosed(self.closed)
if self.buflist:
self.buf += ''.join(self.buflist) # line 271
self.buflist = []
return self.buf
traceback.print_exc(file=o)
电话以防弹?此:
if keyargs.get('traceback',False):
- o = StringIO.StringIO(msg)
- o.write(u'\n')
+ o = StringIO.StringIO()
traceback.print_exc(file=o)
诀窍,但问题仍然存在
答案 0 :(得分:0)
此:
if keyargs.get('traceback',False):
o = StringIO.StringIO()
traceback.print_exc(file=o)
value = o.getvalue()
try:
msg += u'\n%s' % unicode(value, 'utf-8')
except UnicodeError:
traceback.print_exc()
msg += u'\n%s' % repr(value)
o.close()
解决它并避免UnicodeError msg += u'%s' % value
会引发。所以是的 - 我确实混合了字符串和unicode - 字符串在traceback.print_exc(file=o)
调用中进入。
仍然不确定'utf-8'
中的unicode(value, 'utf-8')
是否可行 - 但我想内置的异常会通过这个确定,而我的自定义异常会有unicode消息。还是说路径上的窗口错误可能会在mbcs
中编码?不知道 - 但现在这样做。
输入(或更好的解决方案)赞赏。