2009-03-15 11 views
14

Chciałbym złapać i zalogować ostrzeżenia MySQL w Pythonie. Na przykład, MySQL wyświetla ostrzeżenie o błędzie standardowym, jeśli podasz 'DROP DATABASE IF EXISTS database_of_armaments', gdy taka baza danych nie istnieje. Chciałbym to przechwycić i zalogować, ale nawet w składni try/else pojawia się komunikat ostrzegawczy.Trapping MySQL Ostrzeżenia W Pythonie

Składnia try/except zachowuje błędy MySQL (np. Podanie literówki, takiej jak 'DRP DATABASE database_of_armaments').

Eksperymentowałem z <<except.MySQLdb.Warning>> - bez powodzenia. Przyjrzałem się modułowi ostrzeżeń, ale nie rozumiem, jak włączyć go do składni try/else.

Aby być konkretnym, jak uzyskać następujące (lub coś w tym stylu) do pracy.

PODANE: baza danych "database_of_armaments" nie istnieje.

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:

Dzięki za komentarze. Próbowałem tych i nie działały - ale używałem klasy DatabaseConnection, którą napisałem dla połączenia, i jego metody runQuery() do wykonania. Kiedy utworzyłem połączenie i kursor poza klasą, próba/except Wyjątek przechwycił "Błąd programowania", a oprócz tego MySQLdb.ProgrammingError działał tak jak w reklamie.

Teraz muszę się dowiedzieć, co jest nie tak z moim kodowaniem klasy.

Dziękuję za pomoc.

+1

nie znaleźliśmy żadnych z odpowiedzi tutaj przydatne, ale http://stackoverflow.com/a/2102315/91238 było. – arantius

Odpowiedz

15

Wykonaj następujące kroki.

  1. Uruchom go za pomocą except Exception, e: print repr(e).

  2. Zobacz, jaki wyjątek się pojawia.

  3. Zmień Exception na wyjątek, który faktycznie masz.

Pamiętaj też, że wyjątek e jest obiektem. Możesz wydrukować dir(e), e.__class__.__name__ itp., Aby zobaczyć, jakie ma atrybuty.

Możesz również zrobić to interaktywnie po pytaniu >>> w Pythonie. Następnie możesz manipulować obiektem bezpośrednio - bez zgadywania.

+0

Pomogło mi to, ponieważ django użytecznie używa tej samej nazwy wyjątku, co podstawowe złącze MySQL; 'OperationalError'. Zmieniłem 'from MySQLdb import OperationalError' na' from django.db.utils import OperationalError' na górze mojego pliku, i nagle mogłem złapać wyjątek. –

7

Próbowałeś czegoś takiego?

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 
+0

Choć ta odpowiedź może być bardziej dokładna, to jest to lepszy start niż pozostałe, nie rozumiem, dlaczego została ona obniżona. –

+1

@Flav, ponieważ ostrzeżenia nie "podnoszą" – g33kz0r

2

myślę wyjątek chcesz złapać to MySQLdb.ProgrammingError i uzyskać informacje o tym, po prostu dodać zmienną do przechowywania danych o błędach (krotka) w po tym IE:

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) 
+0

Nie masz na myśli MySQLdb.OperationalError (zamiast ProgrammingError)? – elo80ka

+0

To wyjątek, który został mi rzucony w podobnym projekcie, nad którym pracuję. I tak, myślałem, że to było dziwne. – dangerouslyfacetious

+0

Dzięki, to było pomocne. – chernevik

1

Najpierw należy włączyć ostrzeżenia, aby traktować je jako wyjątki, i tylko wtedy można je złapać. zobacz szczegóły w standardowym module "ostrzeżenia".

0

Jasne i proste

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] Przykład: - (u'Warning', 1366L, u"Incorrect integer value: '\xa3' for column 'in_userid' at row 1")

1

udało mi się pułapki ostrzeżenie mysql tak:

import _mysql_exceptions 

try: 
    foo.bar() 
except _mysql_exceptions.Warning, e: 
    pass