我想在異常被引發後覆蓋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