2009-03-15 15 views
14

Vorrei rilevare e registrare gli avvisi MySQL in Python. Ad esempio, MySQL emette un avviso di errore standard se si invia 'DROP DATABASE IF EXISTS database_of_armaments' quando non esiste un tale database. Mi piacerebbe prendere questo e loggarlo, ma anche nella sintassi try/else il messaggio di avviso appare ancora.Intrappolamento di avvertimenti MySQL in Python

La sintassi try/except rileva gli errori MySQL (ad esempio, l'invio di un errore simile a 'DRP DATABASE database_of_armaments').

Ho sperimentato con <<except.MySQLdb.Warning>> - senza fortuna. Ho esaminato il modulo degli avvisi, ma non capisco come incorporarlo nella sintassi try/else.

Per essere concreti, come faccio a ottenere il seguente (o qualcosa del genere) per funzionare.

GIVEN: il database 'database_of_armaments' non esiste.

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:

Grazie per i commenti. Avevo provato questi e non hanno funzionato - ma stavo usando una classe DatabaseConnection che ho scritto per una connessione, e il suo metodo runQuery() da eseguire. Quando ho creato una connessione e un cursore all'esterno della classe, try/except Exception ha rilevato "Errore di programmazione" e salvo MySQLdb.ProgrammingError ha funzionato come pubblicizzato.

Quindi ora devo capire cosa c'è di sbagliato nella codifica della mia classe.

Grazie per il vostro aiuto.

+1

non ho trovato nessuna delle le risposte qui sono utili, ma http://stackoverflow.com/a/2102315/91238 era. – arantius

risposta

15

Seguire questi passaggi.

  1. eseguirlo con except Exception, e: print repr(e).

  2. Vedere quale eccezione si ottiene.

  3. Modificare lo Exception con l'eccezione che si è effettivamente ottenuto.

Inoltre, ricorda che l'eccezione, e, è un oggetto. È possibile stampare dir(e), e.__class__.__name__, ecc. Per vedere quali attributi ha.

Inoltre, è possibile farlo in modo interattivo al prompt >>> in Python. È quindi possibile manipolare l'oggetto direttamente - senza indovinare.

+0

Questo mi ha aiutato, poiché django utilizza utilmente lo stesso nome di eccezione del connettore MySQL sottostante; 'OperationalError'. Sono passato 'da MySQLdb import OperationalError' a' from django.db.utils import OperationalError' nella parte superiore del mio file, e sono stato improvvisamente in grado di catturare l'eccezione. –

7

Hai provato qualcosa del genere?

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

Anche se questa risposta potrebbe essere più approfondita, è ancora un inizio migliore rispetto agli altri, non vedo perché è stato downvoted. –

+1

@Flav perché gli avvisi non rilevano – g33kz0r

2

Penso che l'eccezione si vuole prendere è un MySQLdb.ProgrammingError, e per ottenere informazioni su di esso, basta aggiungere una variabile per memorizzare i dati di errore (una tupla) in dopo che cioè:

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

Non intendi MySQLdb.OperationalError (invece di ProgrammingError)? – elo80ka

+0

Questa è l'eccezione che è stata lanciata per me in un progetto simile su cui sto lavorando. E sì, ho pensato che fosse strano. – dangerouslyfacetious

+0

Grazie, questo è stato utile. – chernevik

1

Per prima cosa è necessario attivare gli avvisi da considerare come eccezioni e solo dopo è possibile accedervi. vedere il modulo "avvertenze" standard per i dettagli.

0

Chiaro e semplice

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

1

sono riuscito a intrappolare l'avvertimento mysql in questo modo:

import _mysql_exceptions 

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