python - 在 Python 中记录异常时出现 UnicodeDecodeError

标签 python python-2.7 logging unicode

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

当我记录一个包含元音变音的异常时,我总是收到
UnicodeDecodeError:“ascii”编解码器无法解码位置 39 中的字节 0xfc:序号不在范围内 (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 字符串?

最佳答案

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

关于python - 在 Python 中记录异常时出现 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28626984/

相关文章:

python - 正则表达式 Python Django url

python - 用于 s60 的 python 中的希伯来语字符串

python - 无法从 python 发送带有附件的电子邮件?

python - 如何使用 Python 包分发日志配置

python - 按小时向下舍入日期时间列

java - 测量 Python 和 Java 实现之间的性能差异?

python - 使用python执行带变量的linux命令

python - 使用 tensorflow 一次切片多个切片

c# - 需要在AssemblyInfo中引用log4net配置文件

c# - 使用自定义 logentry 类和自定义 logformatter