Ловушка предупреждений MySQL в Python - PullRequest
14 голосов
/ 15 марта 2009

Я хотел бы перехватывать и регистрировать предупреждения MySQL в Python. Например, MySQL выдает предупреждение для стандартной ошибки, если вы отправляете 'DROP DATABASE IF EXISTS database_of_armaments', когда такой базы данных не существует. Я хотел бы поймать это и зарегистрировать его, но даже в синтаксисе try / else по-прежнему появляется предупреждение.

Синтаксис try / исключением распознает ошибки MySQL (например, отправка опечатки, подобной 'DRP DATABASE database_of_armaments').

Я экспериментировал с <<except.MySQLdb.Warning>> - не повезло. Я посмотрел на модуль предупреждений, но не понимаю, как включить его в синтаксис try / else.

Если говорить конкретно, как мне заставить работать следующее (или что-то подобное).

GIVEN: база данных 'database_of_armaments' не существует.

try:
    cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
except: <<WHAT DO I PUT HERE?>>
    print 'There was a MySQL warning.' 
    <<AND what goes here if I want to get and manipulate information about the warning?>>

UPDATE:

Спасибо за комментарии. Я пробовал это, и они не работали - но я использовал класс DatabaseConnection, который я написал для соединения, и его метод runQuery () для выполнения. Когда я создал соединение и курсор вне класса, попытка / исключение Exception обнаружила «Ошибка программирования», и, кроме MySQLdb.ProgrammingError, работала так, как объявлено.

Так что теперь я должен выяснить, что не так с моей кодировкой классов.

Спасибо за вашу помощь.

Ответы [ 6 ]

15 голосов
/ 15 марта 2009

Выполните следующие действия.

  1. Запустите его с except Exception, e: print repr(e).

  2. Посмотрите, какое исключение вы получите.

  3. Измените Exception на исключение, которое вы фактически получили.

Также помните, что исключение e является объектом. Вы можете напечатать dir(e), e.__class__.__name__ и т. Д., Чтобы увидеть, какие атрибуты у него есть.

Кроме того, вы можете сделать это в интерактивном режиме по приглашению >>> в Python. Затем вы можете напрямую управлять объектом - без догадок.

7 голосов
/ 15 марта 2009

Вы пробовали что-то подобное?

try:
    cursor.execute(some_statement)
except MySQLdb.IntegrityError, e: 
    # handle a specific error condition
except MySQLdb.Error, e:
    # handle a generic error condition
except MySQLdb.Warning, e:
    # handle warnings, if the cursor you're using raises them
2 голосов
/ 15 марта 2009

Я думаю, что вы хотите перехватить исключение MySQLdb.ProgrammingError, и чтобы получить информацию о нем, просто добавьте переменную для хранения данных об ошибках (кортеж) после этого, то есть:

try:
    cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
except MySQLdb.ProgrammingError, e:
    print 'There was a MySQL warning.  This is the info we have about it: %s' %(e) 
1 голос
/ 19 июля 2016

Мне удалось перехватить предупреждение mysql следующим образом:

import _mysql_exceptions

try:
    foo.bar()
except _mysql_exceptions.Warning, e:
    pass
1 голос
/ 15 апреля 2011

сначала вы должны включить предупреждения, чтобы рассматривать их как исключения, и только потом вы можете их перехватить. см. фильтр предупреждений об ошибках - https://docs.python.org/3/library/warnings.html#the-warnings-filter

0 голосов
/ 08 октября 2015

Простой и простой

def log_warnings(curs):
    for msg in curs.messages:
        if msg[0] == MySQLdb.Warning:
            logging.warn(msg[1])

cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
log_warnings(cursor)

msg [1] пример: - (u'Warning', 1366L, u"Incorrect integer value: '\xa3' for column 'in_userid' at row 1")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...