首页 / PYTHON / Python:检查异常引发的位置
Python:检查异常引发的位置
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:检查异常引发的位置,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2018字,纯文字阅读大概需要3分钟。
内容图文
![Python:检查异常引发的位置](/upload/InfoBanner/zyjiaocheng/696/925d563145cc4c208206eb17f6561523.jpg)
拿这个代码:
def A():
try:
B()
except Exception:
pass
def B():
C()
def C():
print exception_handling_pointer()
A()
函数exception_handling_pointer应该返回一个指向函数的指针,在该函数中首先检查该特定异常以进行处理.即,在这种情况下,我希望输出是……喜欢:
<function A ...>
如何实现exception_handling_pointer函数?
解决方法:
这是一个非常愚蠢的事情,大多数人会说它无法完成(THC4k为一般的cace提供了令人信服的证据)但它确实听起来很有趣,并且应该在许多实际用例中完全可行.
步骤1.您需要退一步.使用sys._getframe或inspect.currentframe获取第一个(不要告诉任何人,第二个似乎是第一个别名).然后你可以用f.f_back迭代它们
第2步.每个人都有一个f.f_lasti指令.这是在帧中执行的最后一条指令.你必须保存它.现在通过字节码 – f.f_code.co_code – 返回单词,并查找带有跳转到f.f_lasti之后的参数的SETUP_EXCEPT操作码.跳转点是异常处理.
第3步.这是模糊不清的地方.关键是实际比较操作将是COMPARE_OP,其中10为参数.在我见过的所有情况下,都会出现POP_JUMP_IF_FALSE.这将跳转到下一个except子句或finally子句.在它之前将加载异常的代码加载到堆栈上.如果只有一个,则它将是直接的LOAD_GLOBAL或LOAD_GLOBAL或LOAD_FAST(取决于具有例外的模块是全局的还是本地的),后跟LOAD_ATTR.如果有多个异常匹配,则会有一系列加载操作,后跟BUILD_TUPLE(惯用语)或BUILD_LIST(其他一些奇怪或非惯用的情况).
关键是您可以浏览LOAD_X指令并将名称与您匹配的异常进行比较.请注意,您只是在比较名称.如果他们重新分配了这个名字,你就是SOL.
第4步.假设您找到了匹配项.现在您需要功能对象.我可以考虑这样做的最佳方式(我保留更新的权利):f.f_code将具有co_filename属性.你可以遍历sys.modules,每个都有__name__attribute.你可以比较两者,记住你应该使用__name __.endswith(co_filename).获得匹配后,可以遍历模块函数并将其f.func_code.co_firstlineno属性与帧f.f_lineno属性进行比较.当你得到一个匹配,你有你的功能.您应该循环遍历模块中每个类的方法.有可能在某些嵌套函数中进行处理,在这种情况下,我目前无法想到一件明智的事情. (这将是一个完整的其他字节码黑客,并且本身就是flakey)
第5步.利润.
这应该可以让您了解如何进行此操作.有各种各样的角落情况,你无法做到,但在任何正常的使用情况下,你应该能够把它拉下来.如果您编写的代码依赖于能够执行它,它将会破坏.这就是“做因为我可以”的事情.
内容总结
以上是互联网集市为您收集整理的Python:检查异常引发的位置全部内容,希望文章能够帮你解决Python:检查异常引发的位置所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。