我有一个典型的金字塔+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()))

最佳答案

我设法开发出一种可以做到这一点的tween(示例):

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中显式的tween排序之外,没有其他方法起作用(对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

关于python - 如何捕获Pyramid + SQLAlchemy中任何地方发生的OperationalError?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36569824/

10-09 07:26