このような特別な方法はありません。これらはすべてData modelに記載されています。あなたは、単に__intit__
メソッドをオーバーロードすることができます
err = Error(args)
# Somewhere else
raise err
:あなたは、すなわち、
raise Error(args)
の代わりを作成し、初期化エラーをし、それらを上げるの(比較的良好な)練習を使用していると仮定すると、
(それを初期化するために呼び出されます)。
try/exceptに配置することもできます。これを頻繁に行う場合は、コンテキストマネージャを使用できます。これらの方法の両方において
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