例外の隠蔽
名前: 例外の隠蔽
症状: try/except で例外を握りつぶす
気分: ここでエラーになったらNoneを返して、画面には「システムエラー」と表示しよう
code:python
def get_response(key):
try:
data = some_api.get_important_data(key)
result = some_other_api.get_result_from_id(data.important_id)
return result.response
except:
return None
呼び出し元では、以下のようにして使う
code:python
response = get_response(key)
if response is None:
return Response('システムエラー')
...
この処理は、画面に「システムエラー」と表示されたとしてもその原因がわからない。
get_response関数のなかで何が起きているのか、通信エラーなのか、keyが間違っているのか、変数名間違いのプログラミングミスなのか、色々な可能性がありすぎて原因を特定することはできない。
特に、本番環境でリリースしたあとにこのような問題が起こると(そして本番環境では想定していなかったことがよく起こる)、システムをとめて原因を調べることも難しい。
対策は色々考えられるけれど、少なくとも以下のようにログを出力するべきだ。
code:python
import logging
logger = logging.getLogger(__name__)
def get_response(key):
try:
data = some_api.get_important_data(key)
result = some_other_api.get_result_from_id(data.important_id)
return result.response
except Exception as e:
logger.exception('外部API呼び出しで想定していないエラーが発生')
return None
そしてこのログが確実に収集できることを確認しておきたい(ログブラックホール アンチパターン)。 タグ