StringIO getvalue 在打印回溯时引发 UnicodeDecodeError
StringIO getvalue raising UnicodeDecodeError when printing traceback
来电:
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)
对于使用法语语言环境的用户。
deprint 中的第 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
- 字符串的混合发生在哪里?据我所知,我总是传入 unicode。
- 我应该如何重写
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)
有效但问题仍然存在
这个:
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)
调用。
仍然不确定 unicode(value, 'utf-8')
中的 'utf-8'
是否可行 - 但我猜想内置异常会通过这个 ok,而我的自定义异常有 unicode 消息。还是说路径上的 windows 错误可能编码在 mbcs
中?不知道 - 但现在就可以了。
感谢输入(或更好的解决方案)。
来电:
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)
对于使用法语语言环境的用户。
deprint 中的第 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
- 字符串的混合发生在哪里?据我所知,我总是传入 unicode。
- 我应该如何重写
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)
有效但问题仍然存在
这个:
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)
调用。
仍然不确定 unicode(value, 'utf-8')
中的 'utf-8'
是否可行 - 但我猜想内置异常会通过这个 ok,而我的自定义异常有 unicode 消息。还是说路径上的 windows 错误可能编码在 mbcs
中?不知道 - 但现在就可以了。
感谢输入(或更好的解决方案)。