我想在异常被引发后覆盖Python中的Exception子类的打印输出,并且我没有运气让我的覆盖被实际调用。Python:在例外情况下重写__str__
def str_override(self):
"""
Override the output with a fixed string
"""
return "Override!"
def reraise(exception):
"""
Re-raise an exception and override its output
"""
exception.__str__ = types.MethodType(str_override, exception, type(exception))
# Re-raise and remove ourselves from the stack trace.
raise exception, None, sys.exc_info()[-1]
def test():
"""
Should output "Override!" Actually outputs "Bah Humbug"
"""
try:
try:
raise Exception("Bah Humbug")
except Exception, e:
reraise(e, "Said Scrooge")
except Exception, e:
print e
知道为什么这实际上并不覆盖海峡方法?内省实例变量显示该方法实际上被方法重写,但它就像Python只是拒绝通过打印来调用它。
缺少什么我在这里?
这看起来像会起作用。谢谢! – James 2011-05-07 17:33:05
实际上,仔细观察它不会:它会改变异常类。正如我在下面提到的,我基本上正在改变深层类的异常消息,我需要保持它的外在行为。更改类意味着我必须更改处理此异常的任何代码,我不想那样做。 – James 2011-05-07 20:36:56
其实......也许会。 *咧嘴*对不起:来回答中有一些有趣的细节。如果我正确地理解了代码,就会创建一个动态SUBCLASS,它应该仍然保持原始异常接口与外部世界的接口。即//增加A;重新B(A); catch A:也应该抓住B的实例。光滑! – James 2011-05-07 20:41:08