在Python中记录异常时的UnicodeDecodeError

时间:2015-02-20 10:41:04

标签: python python-2.7 logging unicode

我正在使用Python 2.7.9。 Win7 x64上的x32。

当我记录包含元音变音的异常时,我总是收到
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 39: ordinal not in range(128)

我的示例代码是:

except Exception as e:
            logging.error('Error loading SCMTool for repository '
                          '%s (ID %d): %s' % (repo.name, repo.id, e),
                          exc_info=1)

记录的异常是WindowsError: [Error 267] Der Verzeichnisname ist ungültig。 问题是基于“ung Ü ltig”变音符号。

删除最后一个%se后,它没有问题。

每次记录异常时都会发生这种情况,因此无法替换每个记录器。

有没有人知道如何让Exception全局返回一个unicode字符串?

1 个答案:

答案 0 :(得分:13)

您正在尝试将unicode对象插入到str模板中,从而触发隐式编码。

使用unicode模板; logging可以正常处理Unicode:

logging.error(u'Error loading SCMTool for repository '
              '%s (ID %d): %s' % (repo.name, repo.id, e),
              exc_info=1)

另外两个提示:

  • 您不必自己进行插值;如果传入3个元素作为单独的参数进行插值,logging将为您进行插值,但前提是实际上要发出消息。

  • 如果您使用logging.exception(),则会在ERROR级别记录消息,并为您设置exc_info;它可以获得相同的结果,但在以后阅读代码时更容易识别。无论哪种方式,在这种情况下,已经包含例外,不需要在消息中再次包含它。

因此,我会使用:

logging.exception(
    'Error loading SCMTool for repository %s (ID %d)',
    repo.name, repo.id)