沒有這樣的特殊方法存在。所有這些都記錄在Data model。
假設你使用的創建和初始化錯誤,然後養育孩子的(比較好)的做法,即
raise Error(args)
代替:
err = Error(args)
# Somewhere else
raise err
你可以簡單地重載__intit__
方法(被調用來初始化它)。
你也可以試試/除了。如果你經常這樣做,你可以使用上下文管理器。
try:
# ...
except Exception as e:
# Reraise if the exception doesn't have a `.on_raise()` method
# Or that method returns a falsey value.
if not hasattr(e, 'on_raise') or not e.on_raise():
raise
class CustomRaiseAction(object):
def __enter__(self):
return
def __exit__(exception_type, exception_value, traceback):
if hasattr(exception_type, 'on_raise'):
return exception_type.on_raise(exception_value)
custom_raise_action = CustomRaiseAction()
with custom_raise_action:
# ...
在這兩種方式,如果on_raise
方法返回True
,異常就會停止propogating。如果它返回False
(或其他有錯誤的值,如None
),它將被進一步拋出。
您也可以在沒有上下文管理器的情況下通過覆蓋sys.excepthook
來做到這一點。這就像整個程序的__exit__
一樣,當程序即將結束時調用,默認情況下顯示錯誤。請注意,如果另一個程序覆蓋它,這將不起作用,並適用於所有情況,包括其他模塊,這可能會導致意外的行爲。
import sys
old_excepthook = sys.excepthook
def new_excepthook(exception_type, exception_value, traceback):
if hasattr(exception_type, 'on_raise'):
exception_type.on_raise(exception_value)
old_excepthook(exception_type, exception_value, traceback)
sys.excepthook = new_excepthook
而且,您不能停止異常並繼續。
您是否嘗試過在您的子類中的__init __()方法中執行此操作? – martineau