我正在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
答案 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
语句。