2012-07-09 11 views
6

I TRID poniższy kod,jak złapać błąd specyficzny pyodbc wiadomość

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) 

Format komunikatu o błędzie jest wyświetlany jest

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

Chcę otrzymywać tylko część wiadomości błędu tj

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

Nie wiem, czy mogę złapać błędy w szczególności, nie znaleziono sterownika, hosta itp ..

Próbowałem też łapanie błędów jak:

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) 

ale ostatni zawsze łapie błąd.

Fruthermore widziałem pyodbc.Error.message jest zawsze pusty. Jak mogę uzyskać tylko wiadomość zawierającą błąd.

Dzięki

Odpowiedz

4

pyodbc wydaje się po prostu owinąć błędów/wyjątki od podstawowej ODBC realizacji, więc jest mało prawdopodobne, że będziesz w stanie to zrobić.

+0

Dzięki. Oznacza to, że muszę albo użyć Regex, jeśli to możliwe, albo pozostawić go takim, jaki jest, czyż nie :) – ashokadhikari

2

W pirodbc 3.0.7, działa dobrze, aby złapać pyodbc.ProgrammingError (i prawdopodobnie inne typy błędów, chociaż nie próbowałem). Treść tego błędu jest nadal w pewnym sensie tajemnicza, więc może być trudno wykonać drobniejsze przetwarzanie błędów.

4

To zadziałało dla mnie.

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

Istnieją różne wartości SQLSTATES i możesz mieć instrukcje if-else, aby wydrukować przyczynę.

Podobnie

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

daje drugą część błędu z opisem. Na przykład ex.args[0] daje 28000 i ex.args[1] daje [28000] LDAP authentication failed for user 'user' (24) (SQLDriverConnect)

Następnie można użyć technik łańcuchach tam po prostu wydrukować, co chcesz. Mam nadzieję że to pomoże.