栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python:使用自定义sys.excepthook在异常发生之前在上下文中的行号处恢复程序

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python:使用自定义sys.excepthook在异常发生之前在上下文中的行号处恢复程序

进行此类任意跳转的唯一方法是在CPython中,并且以的名称 实现详细信息

sys.settrace

这是一个来自幽默的

goto
愚人节模块的方法,它使我可以跳到(似乎)任意行:

import sysimport inspect_line_number = None_frame = Nonedef jump_to(line_number, frame):    global _line_number, _frame    print("Set jump to line", line_number, "in", inspect.getfile(frame))    _frame = frame    _line_number = line_numberdef _trace(frame, event, arg):    global _line_number, _frame    try:        if _line_number is not None: if inspect.getfile(_frame) == inspect.getfile(frame):     print("Jumping to line", _line_number, "in", inspect.getfile(frame))     frame.f_lineno = _line_number     _line_number = None    except ValueError as e:        print(e)    return _tracedef install():    sys.settrace(_trace)    frame = sys._getframe().f_back    while frame:        frame.f_trace = _trace        frame = frame.f_back

如果我这样运行:

import tracehtraceh.install()import inspecttraceh.jump_to(10, inspect.currentframe())print(1)print(2)print(3)print(4)print(5)print(6)

我得到令人兴奋的输出:

Set jump to line 10 in tr.pyJumping to line 10 in tr.py456

现在,可以

sys.excepthook
肯定地将其嵌入吗?

...def new_sys_excepthook(type, value, traceback):    if type == NameError:        jump_to(traceback.tb_lineno, traceback.tb_frame)        traceback.tb_frame        return    sys.__excepthook__(type, value, traceback)def install():    sys.excepthook = new_sys_excepthook    sys.settrace(_trace)    ...

并使用它:

import tracehtraceh.install()raise NameErrorprint(5)print(6)

和输出…

Set jump to line 4 in tr.py

问题很明显:一旦调用sys.excepthook,外部作用域就消失了,因此绝对没有

_trace
机会在原始文件中运行!

如果我们 假设 有解决方案,然后再使用

jump_to
片刻,该怎么办?

import tracehtraceh.install()import inspecttry:    raise NameError    print(1)    print(2)    print(3)    print(4)    print(5)    print(6)except:    traceh.jump_to(10, inspect.currentframe())

这可以避免我们上次遇到的问题,因为我们正在

jump_to
文件内部手动调用。让我们来看看:

Set jump to line 10 in tr.pyJumping to line 10 in tr.pycan't jump into the middle of a block

该死的

Richie Hindle将想法功劳归功于该

goto
模块。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669594.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号