如何捕获Pyramid + SQLAlchemy中任何地方发生的OperationalError?

时间:2016-04-12 09:56:50

标签: python postgresql exception sqlalchemy pyramid

我有一个典型的Pyramid + SQLAlchemy + Postgres应用程序。在压力测试中或在异常负载时刻以及在PG中设置低max_connections时,可能会发生OperationalException

OperationalError: (psycopg2.OperationalError) FATAL:  sorry, too many clients already

现在,显然我不想这样做无处不在

try:
    DBSession.query(Item)...
except OperationalError as e:
    log.error(...)

是否有某种方法可以捕获此异常"全球"妥善处理?

我的应用以典型的金字塔形式使用ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

1 个答案:

答案 0 :(得分:0)

我设法开发了一个可以做到这一点的补间(例子):

def catch_pg_exc_tween_factory(handler, registry):
    def catch_pg_exc_tween_clos(request):
        response = None
        try:
            response = handler(request)
        except Exception as e:
            log.error('\n\n\n +++ problem: %s', e)
        return response
    return catch_pg_exc_tween_clos

奇怪的是,除了development.ini中明确的补间排序之外什么都不行(over=under= config.add_tween调用pyramid.tweens = pyramid_debugtoolbar.toolbar_tween_factory pyramid.tweens.excview_tween_factory pyramid_tm.tm_tween_factory mypkg.util.tweens.catch_pg_exc_tween_factory 调用似乎没有效果):< / p>

{{1}}