gpt4 book ai didi

python - Monkey Patching Exception 类和其他内置类

转载 作者:太空狗 更新时间:2023-10-30 02:31:46 29 4
gpt4 key购买 nike

不管Excpetion类型是什么,我都想在发生异常时打印一条消息。

我尝试了以下方法:

class MyException(BaseException):
def __init__(self, msg):
super(BaseException, self).__init__(msg)
print "Howdy", msg

__builtins__.Exception = MyException

try:
raise IOError("world")
except Exception as e:
pass

我希望打印“Howdy world”,但我什么也没得到。

编辑:

@helmut 建议使用 sys.settrace,以下代码按预期工作。

import sys

def trace(frame, event, arg):
print event
return trace

sys.settrace(trace)

def foo():
raise Exception()

def bar():
foo()

def baz():
try:
bar()
except:
pass

baz()

exit()

太糟糕了,这对我的用例来说太慢了。

最佳答案

为什么不用 monkey-patch?

让我来解释一下为什么预测方法存在缺陷。当您将 MyException 分配给 Exception 时发生的事情是您更改了此模块中的全局变量 Exception。在此分配之前或在不同模块中定义的所有异常类都不会使用它。他们将改用原始值。由于 IOError 是在解释器启动期间创建的,因此您的分配对其没有影响。因此,如果您要对 Exception 类进行猴子修补,您将覆盖它的方法。最重要的是,您将更改其 __init____new__ 方法。不幸的是,该方法不受支持,更改这些属性会导致:

TypeError: can't set attributes of built-in/extension type 'exceptions.Exception'

因此,猴子修补解释器的方法可能不会奏效。

备选方案:追踪

另一种方法是编写一个传递给 sys.settrace 的函数。每个函数调用都会调用它,如果要跟踪特定的调用,它应该返回另一个跟踪函数。各种事件被传递给后一个跟踪函数,其中之一是'exception'。通过过滤这些事件,您可能已经达到了预期的效果。

关于python - Monkey Patching Exception 类和其他内置类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22187215/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com