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

Python:检查异常引发的位置

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

Python:检查异常引发的位置

这是一件很愚蠢的事情,大多数人会说这是不可能的(THC4k为一般的问题提供了令人信服的证据),但听起来确实很有趣,并且在许多实际用例中应该是完全可行的。

步骤1
。您需要后退框架。用

sys._getframe
或来获得第一个
inspect.currentframe
(不要告诉任何人,第二个似乎是第一个的别名)。然后,您可以使用
f.f_back

第二步
。每个人都会有一条

f.f_lasti
指令。这是框架中执行的最后一条指令。您必须保存它。现在遍历字节码中的后缀
f.f_pre.co_pre
--查找
SETUP_EXCEPT
带有f.f_lasti`
之后 的参数的操作码。跳转点是异常处理。

第三步
。这是变得更加模糊的地方。关键是实际的比较操作将是一个

COMPARE_OP
以10为参数的a。在我所见过的所有情况下,都带有一个
POP_JUMP_IF_FALSE
。这将跳到下一个
except
子句或该
finally
子句。它将在加载代码之前将异常加载到堆栈上。如果只有一个,则它将是一个直线
LOAD_GLOBAL
或a
LOAD_GLOBAL
LOAD_FAST
(取决于模块是全局模块还是局部模块),然后是a
LOAD_ATTR
。如果有多个异常被匹配,那么将有一系列加载操作,然后是
BUILD_TUPLE
(惯用的)或
BUILD_LIST
(某些其他奇怪或非惯用的情况)。

关键是您可以按照

LOAD_X
说明进行操作,并将名称与要匹配的异常进行比较。请注意,您 比较名称
。如果他们已经重新分配了名称,那么您就是SOL。

步骤4
。假设您找到了一个匹配项。现在您需要函数对象。我可以想到的最好方法是(我保留更新的权利):

f.f_pre
将具有
co_filename
属性。您可以循环浏览
sys.modules
,每个都有
__name__
属性。您可以比较应该使用的两个注意事项
__name__.endswith(co_filename)
。当您找到匹配项时,可以遍历模块功能并将它们的
f.func_pre.co_firstlineno
属性与框架进行比较
f.f_lineno
属性。当您找到一个匹配项时,您便具有了自己的功能。您还应该遍历模块中每个类的方法。在某些情况下,这种处理有可能发生在某些嵌套函数中,我目前无法想到要这样做。(这将是其他字节码的入侵,并且本身就是flakey)

步骤5 。利润。

这应该使您大致了解如何执行此操作。在各种各样的极端情况下,您将无法做到这一点,但是在任何正常的用例中,您都应该能够做到。如果您编写依赖于此功能的代码,尽管
失败。这有点像“尽我所能”。



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

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

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