在 Python 中记录异常时出现 UnicodeDecodeError

UnicodeDecodeError when logging an Exception in Python

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

当我记录一个包含变音符号的异常时,我总是收到
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 return 成为全局 unicode 字符串?

您正在尝试将 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)