2012-07-09 8 views
6

ho Trid il seguente codice,come catturare l'errore pyodbc specifica dei messaggi di

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) 

Il formato del messaggio di errore che ottengo è

('HY000', "[HY000] [MySQL][ODBC 5.1 Driver]Access denied for user 'root'@'192.168.2.27' (using password: YES) (1045) (SQLDriverConnect)") 

voglio ricevere solo la parte del messaggio dell'errore cioè

Access denied for user 'root'@'192.168.2.27'(using password: YES) 

non so se riesco a rilevare gli errori in particolare come, driver non trovato, ospiterà giù ecc ..

Ho provato anche la cattura di errori come:

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) 

ma l'ultima cattura sempre l'errore.

Fruthermore ho visto il pyodbc.Error.message è sempre vuoto. Come posso ottenere il messaggio nell'errore.

Grazie

risposta

4

pyodbc sembra avvolgere solo gli errori/eccezioni l'attuazione ODBC sottostante, quindi è improbabile che si sarà in grado di fare questo.

+0

Grazie. Ciò significa che devo usare Regex, se possibile, o lasciarlo così com'è, no? :) – ashokadhikari

2

In pyodbc 3.0.7, funziona correttamente per catturare pyodbc.ProgrammingError (e presumibilmente gli altri tipi di errore, anche se non l'ho provato). Tuttavia, il contenuto dell'errore è ancora un po 'criptico, quindi potrebbe essere difficile eseguire una gestione più fine degli errori.

4

Questo ha funzionato per me.

try: 
     cnxn = pyodbc.connect(...) 
    except pyodbc.Error as ex: 
     sqlstate = ex.args[0] 
     if sqlstate == '28000': 
      print("LDAP Connection failed: check password") 

Ci sono diversi SQLSTATES e si possono avere istruzioni if-else per stampare la causa.

Allo stesso modo,

try: 
     cnxn = pyodbc.connect(...) 
    except pyodbc.Error as ex: 
     sqlstate = ex.args[1] 
     print(sqlstate) 

vi darà la seconda parte dell'errore con la descrizione. Per esempio ex.args[0] darvi 28000 e ex.args[1][28000] LDAP authentication failed for user 'user' (24) (SQLDriverConnect)

È quindi possibile utilizzare le tecniche di manipolazione di stringhe lì per stampare solo ciò che si desidera. Spero che questo ti aiuti.