Google App Engine で集約例外ハンドラ

Google App Engine の webapp.RequestHandler には、ハンドラ内で例外が発生したときに呼び出される handle_exception メソッドがあります。このメソッド、デフォルトでは HTTP ステータスコードを 500 に設定するだけですが、これをオーバーライドして、動作をカスタマイズできます。

例外の情報をログに出力するベースハンドラクラスを作成し、リクエストハンドラはベースハンドラを継承すれば、集約例外ハンドラになりますね。

class BaseHandler(webapp.RequestHandler):
    def handle_exception(self, exception, debug_mode):
        # 例外情報をログに出力。
        logging.exception(exception)

        # とりあえず親の実装を呼び出しておく。
        # 独自のエラーページを表示するのもいいかも。
        super(BaseHandler, self).handle_exception(exception, debug_mode)

class MainHandler(BaseHandler):
    def get(self):
        # 何かやる

毎回 try-catch を書いたり、例外情報をログに出力するデコレータを作るよりも、この方が楽。