как поймать конкретное сообщение об ошибке pyodbc

Я трид следующий код

import pyodbc
try:
    pyodbc.connect('DRIVER={%s};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s' % (driver, server, database, uid, password))
except pyodbc.Error, err:
    logging.warn(err)

формат сообщения об ошибке, который я получаю, -

('HY000', "[HY000] [MySQL][ODBC 5.1 Driver]Access denied for user 'root'@'192.168.2.27' (using password: YES) (1045) (SQLDriverConnect)")

Я хочу получить только ту часть сообщения об ошибке, т. е.

Access denied for user 'root'@'192.168.2.27'(using password: YES)

Я не знаю, Могу ли я поймать ошибки, например, драйвер не найден, хост вниз и т. д..

Я также попытался поймать ошибки как:

 except pyodbc.OperationalError, err:
    logging.warn(err)
except pyodbc.DataError, err:
    logging.warn(err)
except pyodbc.IntegrityError, err:
    logging.warn(err)
except pyodbc.ProgrammingError, err:
    logging.warn(err)
except pyodbc.NotSupportedError, err:
    logging.warn(err)
except pyodbc.DatabaseError, err:
    logging.warn(err)
except pyodbc.Error, err:
    logging.warn(err)

но последний всегда замечает ошибки.

Fruthermore я видел pyodbc.Ошибка.сообщение всегда есть пуста. Как я могу получить только сообщение об ошибке.

спасибо

3 ответов


pyodbc, похоже, просто обертывает ошибки/исключения из базовой реализации ODBC, поэтому маловероятно, что вы сможете это сделать.


это работает для меня.

    try:
        cnxn = pyodbc.connect(...)
    except pyodbc.Error as ex:
        sqlstate = ex.args[0]
        if sqlstate == '28000':
            print("LDAP Connection failed: check password")

существуют разные SQLSTATES, и вы можете иметь операторы if-else для распечатки причины.

аналогично,

  try:
        cnxn = pyodbc.connect(...)
  except pyodbc.Error as ex:
        sqlstate = ex.args[1]
        print(sqlstate) 

даст вам вторую часть ошибки с описанием. Напримерex.args[0] даст вам 28000 и ex.args[1] дает [28000] LDAP authentication failed for user 'user' (24) (SQLDriverConnect)

затем вы можете использовать методы манипуляции строками, чтобы просто распечатать то, что вы хотите. Надеюсь, это поможет.


в pyodbc 3.0.7, он отлично работает, чтобы поймать pyodbc.ProgrammingError (и, предположительно, другие типы ошибок, хотя я не пробовал). Однако содержимое ошибки по-прежнему является загадочным, поэтому может быть трудно выполнить более тонкую обработку ошибок.