как поймать конкретное сообщение об ошибке 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 (и, предположительно, другие типы ошибок, хотя я не пробовал). Однако содержимое ошибки по-прежнему является загадочным, поэтому может быть трудно выполнить более тонкую обработку ошибок.