2017-06-04 10 views
1

Exceptionクラスがスローされたときに「何か」するクラスが必要です。 ダミー例:プリプロッグフックのカスタム例外?

class BrowserEatRamError(Exception): 
    def __raise__(self): 
     os.system('Killall -9 chrome') 
     super(BrowserEatRamError, self).__raise__() 

私が使用してそれを投げる:

raise BrowserEatRamError('Chrome is eating all ram') 

例外がスローされる前に、Chromeは閉じる必要があります。それを達成できる魔法がありますか?そうでない場合、同様の動作を達成する最もエレガントな方法は何ですか?

EDIT:

私は例外がtryキャッシュ内で上げてものinitが起動されるためのinitを使用しません。

+0

サブクラスの '__init __()'メソッドでやってみましたか? – martineau

答えて

2

このような特別な方法はありません。これらはすべて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 

また、例外を停止して続行することはできません。

+0

tryキャッシュで例外が発生しても、__init__が呼び出されます。 CustomRaiseActionは、例外クラスのユーザーに強制的に「ドライ」違反をさせます。 sys.excepthookをオーバーライドすることが最善の考えです。 私は "isinstance(exception_value、MyException)"がより良いと思います "hasattr(exception_type、 'on_raise') –