関数といくつかのクラスを含む python モジュールがあります。このモジュールは基本的に、私の同僚の何人かによってツールセットとして使用されています。
私は、誰かが私が処理しない例外を生成するたびに、例外に関する情報を電子メールで送信する、一種のバグ報告システムをセットアップしたいと考えています。このようにして、コードの堅牢性とエラー メッセージの充実度を継続的に向上させることができます。これを行うには、モジュール全体に try/except ブロックを配置するのが最善の方法ですか?
あなたのアプローチが最善ではないかもしれないと私が考える理由はいくつかあります。
例外をスローする必要がある場合もあります。たとえば、関数に愚かな引数を渡すと、例外をスローして文句を言う必要があります。誰かが整数の代わりに文字列を渡すたびにメールを受け取りたくありませんか?
さらに、すべてを try...except でラップしても機能しません。これは、クラス/関数の定義中 (モジュールがロード/インポートされたとき) に発生する例外のみをキャッチするためです。例えば、
# Your python library
try:
def foo():
raise Exception('foo exception')
return 42
except Exception as e:
print 'Handled: ', e
# A consumer of your library
foo()
例外はまだキャッチされていません。
自分SelfMailingException
で作成してサブクラス化できると思います。このアプローチをお勧めするわけではありません。
別のオプション:
def raises(*exception_list):
def wrap(f):
def wrapped_f(*x, **y):
try:
f(*x, **y)
except Exception as e:
if not isinstance(e, tuple(exception_list)):
print('send mail')
# send mail
raise
return wrapped_f
return wrap
利用方法:
@raises(MyException)
def foo():
...