traceback.print_exc()中的sys.stdout的UnicodeDecodeError

时间:2014-07-15 06:59:57

标签: python python-unicode

我正在UnicodeDecodeError获得traceback.print_exc(file=sys.stdout)。我正在使用Python3.4并没有遇到Python2.7的问题。

我在这里遗漏了什么吗?如何确保sys.stdout将正确的编码/解码传递给traceback.print_exc()

我的代码与此类似:

try:
    # do something which might throw an exception
except Exception as e:
    # do something
    traceback.print_exc(file=sys.stdout) # Here I am getting the error

错误日志:

  traceback.print_exc(file=sys.stdout)
  File "C:\Python34\lib\traceback.py", line 252, in print_exc
    print_exception(*sys.exc_info(), limit=limit, file=file, chain=chain)
  File "C:\Python34\lib\traceback.py", line 169, in print_exception
    for line in _format_exception_iter(etype, value, tb, limit, chain):
  File "C:\Python34\lib\traceback.py", line 153, in _format_exception_iter
    yield from _format_list_iter(_extract_tb_iter(tb, limit=limit))
  File "C:\Python34\lib\traceback.py", line 18, in _format_list_iter
    for filename, lineno, name, line in extracted_list:
  File "C:\Python34\lib\traceback.py", line 65, in _extract_tb_or_stack_iter
    line = linecache.getline(filename, lineno, f.f_globals)
  File "C:\Python34\lib\linecache.py", line 15, in getline
    lines = getlines(filename, module_globals)
  File "C:\Python34\lib\linecache.py", line 41, in getlines
    return updatecache(filename, module_globals)
  File "C:\Python34\lib\linecache.py", line 127, in updatecache
    lines = fp.readlines()
  File "C:\Python34\lib\codecs.py", line 313, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe7 in position 5213: invalid continuation byte

1 个答案:

答案 0 :(得分:1)

回溯模块希望包含带有回溯的源代码行。通常,回溯只包含指向源代码的指针,而不是源代码本身,因为Python一直在执行编译的字节码。在字节码中有关于字节码来自哪个源代码行的提示。

然后显示源代码,使用linecache模块从磁盘读取实际源代码。这也意味着Python也必须确定这些文件的编码。 Python 3源文件的默认编码是UTF-8,但您可以设置PEP 263 comment以让Python知道您是否偏离此类。

因为在代码已经加载并且发生了回溯之后读取了源代码,所以在启动脚本后可能会更改源代码, >或有一个字节缓存文件(在__pycache__子目录中)看起来很新鲜,但不再匹配您的源文件。

无论哪种方式,当您启动脚本时,Python都能够重新使用bytecache文件或者正确读取源代码并运行您的代码。但是当打印回溯时,至少一个的源代码文件不再可以解码为UTF-8。

如果你可以可靠地重现追溯(所以再次启动Python脚本而没有编码问题但打印回溯失败),它很可能是一个过时的字节码文件,甚至可以保存指向的文件名的指针现在只包含二进制数据,而不是普通数据源。

如果您知道如何使用pdb module,请在pdb.set_trace()调用之前添加traceback.print_exc()调用,并跟踪linecache模块正在加载的文件名。< / p>

否则编辑您的C:\Python34\lib\traceback.py文件,并在print('Loading {} from the linecache'.format(filename))函数的linecache.checkcache(filename)行前面插入_extract_tb_or_stack_iter语句。