2012-07-09 48 views
6

I TrID el siguiente código,cómo atrapar errores pyodbc específica mensaje

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) 

El formato del mensaje de error que consigo es

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

Quiero recibir solo la parte del mensaje del error es decir

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

No sé si puedo detectar errores específicamente como, controlador no encontrado, host abajo, etc.

También probé la captura de errores como:

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) 

pero el último siempre captura el error.

Fruthermore vi el pyodbc.Error.message siempre está vacío. ¿Cómo puedo obtener solo el mensaje en el error?

Gracias

Respuesta

4

pyodbc parece simplemente envolver los errores/excepciones a la aplicación de ODBC subyacente, por lo que es poco probable que usted será capaz de hacer esto.

+0

Gracias. Eso significa que tengo que usar Regex, si es posible, o dejarlo como está, ¿no es así? :) – ashokadhikari

2

En pyodbc 3.0.7, funciona bien capturar pyodbc.ProgrammingError (y presumiblemente los otros tipos de error, aunque no lo he intentado). Sin embargo, el contenido del error sigue siendo algo críptico, por lo que puede ser difícil hacer un manejo más preciso de los errores.

4

Esto funcionó para mí.

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

Existen diferentes SQLSTATES y puede tener sentencias if-else para imprimir la causa.

Del mismo modo,

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

le dará la segunda parte del error con la descripción. Por ejemplo ex.args[0] le dan 28000 y ex.args[1] da [28000] LDAP authentication failed for user 'user' (24) (SQLDriverConnect)

A continuación, puede utilizar técnicas de manipulación de cadenas no imprimir sólo lo que quiere. Espero que esto ayude.

Cuestiones relacionadas