code: def is_disconnect(e, connection, cursor):
      
      if isinstance(e, OperationalError):
          # these error messages from libpq: interfaces/libpq/fe-misc.c.
          # TODO: these are sent through gettext in libpq and we can't
          # check within other locales - consider using connection.closed
          return 'terminating connection' in str(e) or \
                  'closed the connection' in str(e) or \
                  'connection not open' in str(e) or \
                  'could not receive data from server' in str(e)
      elif isinstance(e, InterfaceError):
          # psycopg2 client errors, psycopg2/conenction.h, psycopg2/cursor.h
          return 'connection already closed' in str(e) or \
                  'cursor already closed' in str(e)
      elif isinstance(e, ProgrammingError):
          # not sure where this path is originally from, it may
          # be obsolete.   It really says "losed", not "closed".
          return "closed the connection unexpectedly" in str(e)
      else:
          return False
docs: Connection state check from SQLAlchemy:
      https://bitbucket.org/sqlalchemy/sqlalchemy/src/tip/lib/sqlalchemy/dialects/postgresql/psycopg2.py