2012-07-09 35 views
6

我TRID下面的代碼,如何捕捉特定pyodbc錯誤信息

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) 

錯誤信息格式我得到的是

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

我想只接收錯誤的消息部分即

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

我不知道我是否可以特意抓到錯誤,找不到驅動程序,找不到主機等。

我也試圖捕捉錯誤爲:

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) 

但最後一個總是捕獲錯誤。

Fruthermore我看到了pyodbc.Error.message總是空的。 我怎樣才能得到錯誤中的消息。

感謝

回答

4

pyodbc似乎只是包裝錯誤/從基礎ODBC執行的例外,所以這是不可能的,你就可以做到這一點。

+0

謝謝。這意味着我必須使用正則表達式,如果可能的話,或者保持原樣,是不是:) – ashokadhikari 2012-08-03 05:28:24

2

在pyodbc 3.0.7中,它可以很好地捕獲pyodbc.ProgrammingError(並且可能是其他錯誤類型,儘管我沒有嘗試過)。儘管如此,錯誤的內容仍然有點神祕,因此可能很難對錯誤進行更細緻的處理。

4

這對我有用。

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

有不同的SQLStates,你可以有if-else語句打印出來的原因。

同樣,

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

會給你描述錯誤的第二部分。 例如ex.args[0]給你28000ex.args[1][28000] LDAP authentication failed for user 'user' (24) (SQLDriverConnect)

然後就可以使用字符串操作技術有隻打印出你想要的東西。希望這可以幫助。