2012-12-19 9 views
10

ピラミッドウェブアプリケーションで「キャッチオール」エラー処理を処理できる方法はありますか?私は現在、例外ログを(http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.htmlのドキュメントを介して)データベースに実装しています。私は、自分の意見にメッセージを返して、何が起こったのかを「フレンドリーな」顔にします。ピラミッドキャッチオールフレンドリーな例外処理

しかし、何か一般的な「おっと、あなたが問題に遭遇し、私たちはそれを調べています」と明示的に捕まえていないことを実装できるものがあります。データベースの内容をログに記録するエラーハンドラまたは、検索でどのようなことを探しているはずですか?

おかげで、私はコメントにそれすべてに適合することはできませんので、

編集、: 。 ありがとう、それは私が探しているのとまったく同じようです!それが関係かいない場合、私はに実行している

ことの一つは、私が

は、だから私はそうのように、上記のようにSQLロガーを実装しています....知らない:

class SQLAlchemyHandler(logging.Handler): 
    # A very basic logger that commits a LogRecord to the SQL Db 
    def emit(self, record): 
     trace = None 
     exc = record.__dict__['exc_info'] 
     if exc: 
      trace = traceback.format_exc(exc) 
     log = Log(
      logger=record.__dict__['name'], 
      level=record.__dict__['levelname'], 
      trace=trace, 
      msg=record.__dict__['msg'],) 
     DBSession.add(log) 
     DBSession.flush() 
     #transaction.commit() 

トランザクションを使用するときにSQLAlchemy DetachedInstanceError例外が発生したため、 'transaction.commit()'コールを取り出して代わりに.flush()を使用する必要がありました。私はヘルパー関数にリクエストを渡すことでいくつかのゲームをしているからだと思うし、それが投げているようだ。したがって、セッションをフラッシュすることによって動作します。 Buuuutは、例外ビューが実際にスローされた場合、log.error()ステートメントを例外ビューに入れておけば、ビューのログステートメントはコミットされません。 Pyramidのデバッグログには、書き込まれていることが示されていますが、コミットされたことはありません。

ロギングハンドラをtransaction.commitに戻した場合、例外になりますが、元の問題に戻ります。私は、私が最初にそれを引き起こしているヘルパー関数でやっていることに焦点を当てる必要があると思うが、私はまだ一般的にSQLAlchemyを学んでいる。時にはそれは少し奇妙なことがあります。

答えて

10

exception viewを設定できます。例:

@view_config(context=Exception) 
def error_view(exc, request): 
    #log or do other stuff to exc... 
    return Response("Sorry there was an error") 
+0

ああいいね!そして、これは_any_例外を処理するだろう_anywhere_ビューで呼び出し可能な、正しい?レスポンスを返す代わりに、私は技術的に「スロー」をもう一度行うことができますか?このアプローチは今日でも推奨されていますか? – Jens