在 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" 元音变音。
删除最后一个 %s
和 e
后,它可以正常工作。
每次记录异常时都会发生这种情况,因此无法替代每个记录器。
有谁知道如何使 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)
我正在使用 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" 元音变音。
删除最后一个 %s
和 e
后,它可以正常工作。
每次记录异常时都会发生这种情况,因此无法替代每个记录器。
有谁知道如何使 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)