StringIO getvalue在打印回溯时引发UnicodeDecodeError

时间:2015-02-22 17:12:46

标签: python-2.7 python-unicode stringio

电话:

deprint(_(u'Error finding icon for %s:') % target.s, traceback=True)

where

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
  1. 弦的混合在哪里?据我所知,我总是通过unicode。
  2. 我应该如何重写traceback.print_exc(file=o)电话以防弹?
  3. 此:

         if keyargs.get('traceback',False):
    -        o = StringIO.StringIO(msg)
    -        o.write(u'\n')
    +        o = StringIO.StringIO()
             traceback.print_exc(file=o)
    

    诀窍,但问题仍然存在

1 个答案:

答案 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中编码?不知道 - 但现在这样做。

输入(或更好的解决方案)赞赏。

相关问题