ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

为什么Python线缓存会影响回溯模块而不影响常规回溯?

2019-10-25 05:59:27  阅读:201  来源: 互联网

标签:traceback python


考虑以下Python程序:

code = """
def test():
    1/0
"""

filename = "<test>"

c = compile(code, filename, 'exec')
exec(c)

import linecache

linecache.cache[filename] = (len(code), None, code.splitlines(keepends=True), filename)

import traceback

print("Traceback from the traceback module:")
print()
try:
    test()
except:
    traceback.print_exc()

print()
print("Regular traceback:")
print()

test()

我正在动态定义一个引发异常的函数,并将其添加到行缓存中.代码的输出是

Traceback from the traceback module:

Traceback (most recent call last):
  File "test.py", line 20, in <module>
    test()
  File "<test>", line 3, in test
    1/0
ZeroDivisionError: division by zero

Regular traceback:

Traceback (most recent call last):
  File "test.py", line 28, in <module>
    test()
  File "<test>", line 3, in test
ZeroDivisionError: division by zero

如果随后使用traceback模块从该函数获得了traceback,则会显示该函数的代码行(第一个traceback的1/0部分).但是,如果我只是让代码引发异常并从解释器获取常规回溯,则它不会显示代码.

为什么常规解释器回溯不使用行缓存?有没有办法使代码显示在常规回溯中?

解决方法:

默认值sys.excepthook使用回溯打印的单独C级实现,而不是回溯模块. (也许是这样,即使系统过于枯燥而无法使用traceback.py.它仍然可以使用.)C实现不尝试使用行缓存.您可以在_Py_DisplaySourceLine中看到它用于检索源代码行的代码.

如果希望回溯使用回溯模块的实现,则可以将sys.excepthook替换为traceback.print_exception

import sys
import traceback
sys.excepthook = traceback.print_exception

标签:traceback,python
来源: https://codeday.me/bug/20191025/1926416.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有