11

Pyramid Webアプリである種の「キャッチオール」エラー処理を処理する方法はありますか?私は現在、データベースへの例外ロギングを実装しています(http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.htmlのドキュメントを介して)。何が起こったのかについての「友好的な」顔。

しかし、明示的にキャッチしていない他の何かについて、ある種の一般的な「おっと、あなたは問題に遭遇し、私たちはそれを調べています」を示す実装できるものはありますか?上記のエラーハンドラーを背後で使用できますデータベースに何でも記録するシーン?または、検索でどのようなものを探す必要がありますか?

ありがとう、

すべてをコメントに収めることができないため、編集します。ありがとう、それはまさに私が探しているもののようです!

私が遭遇していることの1つは、それが関連しているかどうかわからないということです。

だから私は上記のように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()

トランザクションの使用時にSQLAlchemyDetachedInstanceError例外が発生したため、「transaction.commit()」呼び出しを実行し、代わりに.flush()を使用する必要がありました。ヘルパー関数にリクエストを渡してゲームをしているからだと思いますが、そこにリクエストが投げられているようです。したがって、セッションをフラッシュすることで機能します。Buuuut、例外ビューにlog.error()ステートメントがある場合、例外が実際にスローされた場合、ビューはそれをキャッチしますが(素晴らしい!)、ビューのlogステートメントはコミットされません。Pyramidのデバッグログには、書き込まれていることが示されていますが、コミットされていません。

ロギングハンドラーをtransaction.commitに戻すと、例外コミットされますが、元の問題に戻ります。そもそもヘルパー関数で何をしているのかということに焦点を当てる必要があると思いますが、SQLAlchemy全般についても学んでいます。時々それは少し奇妙かもしれません。

4

1 に答える 1

13

例外ビューを設定できます。例えば:

@view_config(context=Exception)
def error_view(exc, request):
    #log or do other stuff to exc...
    return Response("Sorry there was an error")
于 2012-12-19T03:35:54.027 に答える