Spec-Zone .ru
спецификации, руководства, описания, API

22.6.7.1. Ошибки и Исключения

mysql.connector.errors модуль определяет классы исключений для ошибок и предупреждений, повышенных MySQL, Connector/Python. Большинство классов, определенных в этом модуле, доступно, когда Вы импортируете mysql.connector.

Классы исключений, определенные в этом модуле главным образом, следуют за Спецификацией v2.0 Базы данных Python (PEP 249). Для некоторого клиента MySQL или ошибок сервера это является не всегда четким который исключение повысить. Хорошо обсудить, должна ли ошибка быть повторно классифицирована, открывая отчет об ошибках.

Ошибки MySQL Server отображаются с исключением Python, основанным на их значении SQLSTATE (см. Раздел C.3, "Коды ошибки сервера и сообщения"). Следующая таблица показывает классы SQLSTATE и повышения Соединителя/Python исключения., однако, возможно пересмотреть, какое исключение повышается для каждой ошибки сервера. Отметьте, что исключение значения по умолчанию DatabaseError.

Таблица 22.34.

Класс SQLSTATE Исключение соединителя/Python
02 DataError
02 DataError
07 DatabaseError
08 OperationalError
0A NotSupportedError
21 DataError
22 DataError
23 IntegrityError
24 ProgrammingError
25 ProgrammingError
26 ProgrammingError
27 ProgrammingError
28 ProgrammingError
2A ProgrammingError
2B DatabaseError
2C ProgrammingError
2D DatabaseError
2E DatabaseError
33 DatabaseError
34 ProgrammingError
35 ProgrammingError
37 ProgrammingError
3C ProgrammingError
3D ProgrammingError
3F ProgrammingError
40 InternalError
42 ProgrammingError
44 InternalError
HZ OperationalError
XA IntegrityError
0K OperationalError
HY DatabaseError

22.6.7.1.1. Модуль errorcode

Этот модуль содержит и сервер MySQL и клиентские коды ошибки, определенные, поскольку модуль приписывает с кодом ошибки как значение. Используя коды ошибки вместо кодов ошибки мог сделать чтение исходного кода немного легче.

>>> from mysql.connector import errorcode>>> errorcode.ER_BAD_TABLE_ERROR1051

См. Раздел C.3, "Коды ошибки сервера и сообщения" и Раздел C.4, "Клиентские Коды ошибки и сообщения".

22.6.7.1.2. Исключение errors.Error

Этим исключением является основной class для всех других исключений в errors модуль. Это может использоваться, чтобы зафиксировать все ошибки в сингле except оператор.

Следующий пример показывает, как мы могли поймать синтаксические ошибки:

import mysql.connectortry:  cnx = mysql.connector.connect(user='scott', database='employees')  cursor = cnx.cursor()  cursor.execute("SELECT * FORM employees")   # Syntax error in query  cnx.close()except mysql.connector.Error as err:  print("Something went wrong: {}".format(err))

Инициализация исключения поддерживает несколько дополнительных параметров, а именно, msg, errno, values и sqlstate. Все они являются дополнительными и значение по умолчанию к None. errors.Error внутренне используется Соединителем/Python, чтобы повысить ошибки клиента и сервера MySQL и не должен использоваться Вашим приложением, чтобы повысить исключения.

Следующие примеры показывают результат при использовании никаких параметров или комбинации параметров:

>>> from mysql.connector.errors import Error>>> str(Error())'Unknown error'>>> str(Error("Oops! There was an error."))'Oops! There was an error.'>>> str(Error(errno=2006))'2006: MySQL server has gone away'>>> str(Error(errno=2002, values=('/tmp/mysql.sock', 2)))"2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)">>> str(Error(errno=1146, sqlstate='42S02', msg="Table 'test.spam' doesn't exist"))"1146 (42S02): Table 'test.spam' doesn't exist"

Пример, который использует код ошибки 1146, используется, когда Соединитель/Python получает ошибочный пакет от MySQL Server. Информация анализируется и передается к Error исключение как показано.

Каждое разделение на подклассы исключения от Error может быть инициализирован, используя ранее упомянутые параметры. Дополнительно, у каждого экземпляра есть атрибуты errno, msg и sqlstate который может использоваться в Вашем коде.

Следующий пример показывает, как обработать ошибки, отбрасывая таблицу, которая не существует (когда DROP TABLE оператор не включает a IF EXISTS пункт):

import mysql.connectorfrom mysql.connector import errorcodecnx = mysql.connector.connect(user='scott', database='test')try:  cur.execute("DROP TABLE spam")except mysql.connector.Error as err:  if err.errno == errorcode.ER_BAD_TABLE_ERROR:    print("Creating table spam")  else:    raise

errors.Error подкласс Python StandardError.

22.6.7.1.3. Исключение errors.Warning

Это исключение используется для того, чтобы сообщить о важных предупреждениях, однако, Соединитель/Python не использует его. Это включается, чтобы быть совместимым со Спецификацией v2.0 Базы данных Python (PEP 249).

Рассмотрите использование или более строгих Режимов SQL Сервера или raise_on_warnings параметра соединения, чтобы сделать ошибки повышения Соединителя/Python, когда Ваши запросы производят предупреждения.

errors.Warning подкласс Python StandardError.

22.6.7.1.4. Исключение errors.InterfaceError

Это исключение повышается для ошибок, происходящих из Соединителя/Python непосредственно, не связывается с сервером MySQL.

errors.InterfaceError подкласс errors.Error.

22.6.7.1.5. Исключение errors.DatabaseError

Это исключение является значением по умолчанию для любой ошибки MySQL, которая не соответствует другим исключениям.

errors.DatabaseError подкласс errors.Error.

22.6.7.1.6. Исключение errors.InternalError

Это исключение повышается, когда сервер MySQL встречается с внутренней ошибкой, например, когда мертвая блокировка произошла.

errors.InternalError подкласс errors.DatabaseError.

22.6.7.1.7. Исключение errors.OperationalError

Это исключение повышается для ошибок, которые связываются с операциями MySQL. Например: слишком много соединений; имя хоста не могло быть разрешено; плохое квитирование; сервер завершает работу, коммуникационные ошибки.

errors.OperationalError подкласс errors.DatabaseError.

22.6.7.1.8. Исключение errors.ProgrammingError

Это исключение повышается при программировании ошибок, например когда у Вас есть синтаксическая ошибка в Вашем SQL, или таблица не была найдена.

Следующий пример показывает, как обработать синтаксические ошибки:

try:  cursor.execute("CREATE DESK t1 (id int, PRIMARY KEY (id))")except mysql.connector.ProgrammingError as err:  if err.errno == errorcode.ER_SYNTAX_ERROR:    print("Check your syntax!")  else:    print("Error: {}".format(err))

errors.ProgrammingError подкласс errors.DatabaseError.

22.6.7.1.9. Исключение errors.IntegrityError

Это исключение повышается, когда на реляционную целостность данных влияют. Например, двойной ключ был вставлен, или ограничение внешнего ключа перестанет работать.

Следующий пример показывает двойную ключевую ошибку, повышенную как IntegrityError:

cursor.execute("CREATE TABLE t1 (id int, PRIMARY KEY (id))")try:  cursor.execute("INSERT INTO t1 (id) VALUES (1)")  cursor.execute("INSERT INTO t1 (id) VALUES (1)")except mysql.connector.IntegrityError as err:  print("Error: {}".format(err))

errors.IntegrityError подкласс errors.DatabaseError.

22.6.7.1.10. Исключение errors.DataError

Это исключение повышается, когда были проблемы с данными. Примерами является набор столбца к NULL это не может быть NULL, значения из диапазона для столбца, подразделения нулем, количество столбца не соответствует количество значения и так далее.

errors.DataError подкласс errors.DatabaseError.

22.6.7.1.11. Исключение errors.NotSupportedError

Это исключение повышается, когда некоторая функция была использована, который не поддерживается версией MySQL, который возвратил ошибку. Это также повышается при использовании функций или операторов, которые не поддерживаются сохраненными подпрограммами.

errors.NotSupportedError подкласс errors.DatabaseError.

22.6.7.1.12. Функция errors.custom_error_exception(error=None,exception=None)

Этот метод определяет пользовательские исключения для ошибок сервера MySQL и возвращает текущие настройки.

Если error код ошибки MySQL Server, следует также передать exception class. error параметром может быть словарь, когда ключ является кодом ошибки сервера, и оцените class исключения, которое будет повышено.

Чтобы сбросить настройки, предоставьте пустой словарь.

import mysql.connectorfrom mysql.connector import errorcode# Server error 1028 should raise a DatabaseErrormysql.connector.custom_error_exception(1028, mysql.connector.DatabaseError)# Or using a dictionary:mysql.connector.custom_error_exception({  1028: mysql.connector.DatabaseError,  1029: mysql.connector.OperationalError,})# To reset, pass an empty dictionary:mysql.connector.custom_error_exception({})