私はあなたと同じ船に乗っていました。デフォルトのメカニズムが好きではありませんでした。幸いなことに、web2py でカスタマイズされた例外処理は非常に簡単です。web2py ディレクトリのルートにある routes.py を見てください。私は私のものに以下を追加しました:
routes_onerror = [('application_name/*','/application_name/error/index')]
これにより、def インデックスを次のように定義したエラー ハンドラー コントローラー (application_name/controllers/error.py) に例外がルーティングされます。
def index():
if request.vars.code == '400':
return(dict(app=request.application,
ticket=None,
traceback="A 400 error was raised, this is controller/method path not found",
code=None,
layer=None,
wasEmailed=False))
elif request.vars.code == '404':
return(dict(app=request.application,
ticket=None,
traceback="A 404 error was raised, this is bad.",
code=None,
layer=None,
wasEmailed=False))
else:
fH = file('applications/%s/errors/%s' % (request.application,request.vars.ticket.split("/")[1]))
e = cPickle.load(fH)
fH.close()
__sendEmail(request.application,e['layer'],e['traceback'],e['code'])
return(dict(app=request.application,
ticket=request.vars.ticket,
traceback=e['traceback'],
code=e['code'],
layer=e['layer'],
wasEmailed=True))
400 以外のエラーと 404 エラーでわかるように、トレースバックを自分宛てにメールで送信し、対応するビュー/エラー/index.html を呼び出しています。本番環境では、このビューは一般的な「エラーが発生して申し訳ありません。開発者にメールを送信しました」というメッセージを表示します。私の開発サーバーでは、フォーマットされたトレースバックが表示されます。