无法在 App Engine 上捕获 MySQLdb.OperationalError

Posted

技术标签:

【中文标题】无法在 App Engine 上捕获 MySQLdb.OperationalError【英文标题】:Cannot catch MySQLdb.OperationalError on App Engine 【发布时间】:2015-02-19 15:48:28 【问题描述】:

我有一个在 Google App Engine 上运行的 Django 应用。数据库不时引发OperationalError,这是正常的,但是我的代码虽然使用了try..except,但没有捕获异常(我需要这个来重试)。

这是我的代码:

from mysqldb import OperationalError, DatabaseError

DB_RETRY_EXCEPTIONS = (
    OperationalError,
    DatabaseError,
)

class MyClassView(rest_framework.views.APIView):
    @retry(DB_RETRY_EXCEPTIONS, tries=5, delay=5, logger=logger)
    def dispatch(self, *args, **kwargs):
        try:
            return super(MyClassView, self).dispatch(*args, **kwargs)
        except DB_RETRY_EXCEPTIONS as exp:
            logger.warning("Got %s", exp)
            raise

在异常堆栈跟踪中,我可以看到流程正在通过这段代码,但没有警告。

这是堆栈跟踪的最后几行:

File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/MySQLdb-1.2.4b4/MySQLdb/__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/MySQLdb-1.2.4b4/MySQLdb/connections.py", line 190, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 38")

感谢任何帮助。

【问题讨论】:

【参考方案1】:

原来django.db.utils.OperationalError 上还有另一个OperationalError,这就是提出的那个。解决方案是也捕获此异常。

【讨论】:

以上是关于无法在 App Engine 上捕获 MySQLdb.OperationalError的主要内容,如果未能解决你的问题,请参考以下文章

在 App Engine Standard 上部署时无法生成 quickstart.xml

在 Google App Engine 上部署 Django ==> 错误:(gcloud.app.deploy)NOT_FOUND:无法检索 P4SA(...)

Google App Engine 上的 Production App 突然无法访问 Google Cloud Storage

在 Flask + Google App Engine 上启用 SSL

带有Firebase的Google App Engine-无法添加依赖项

使用 Google App Engine 时无法导入 Flask