2014-12-21 17 views
6

Ho un'app Django in esecuzione su Google App Engine. Di tanto in tanto il DB solleva OperationalError che è normale, tuttavia il mio codice, sebbene l'utilizzo di try..except, non stia rilevando l'eccezione (ho bisogno di questo per i tentativi).Impossibile catturare MySQLdb.OperationalError su App Engine

Ecco il mio codice:

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 

Nel stack eccezione, posso vedere che il flusso sta attraversando questo pezzo di codice, ma nessun avviso.

Ecco le ultime righe del stack trace:

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") 

Ogni aiuto è apprezzato.

risposta

3

Si è scoperto che c'è un altro OperationalError allo django.db.utils.OperationalError e quello è stato quello che è stato sollevato. La soluzione era prendere anche questa eccezione.