web-dev-qa-db-ja.com

特定の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)

しかし、最後のものは常にエラーをキャッチします。

さらに、pyodbc.Error.messageは常に空であることがわかりました。エラーのメッセージだけを取得するにはどうすればよいですか。

ありがとう

14
ashokadhikari

pyodbcは、基礎となるODBC実装からのエラー/例外をラップしているように見えるため、これを実行できる可能性はほとんどありません。

6
Daniel Watkins

これは私のために働いた。

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

さまざまなSQLSTATEがあり、if-elseステートメントを使用して原因を出力できます。

同様に、

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

エラーの2番目の部分と説明が表示されます。たとえば、_ex.args[0]_は_28000_を提供し、_ex.args[1]_は[28000] LDAP authentication failed for user 'user' (24) (SQLDriverConnect)を提供します

次に、そこで文字列操作技術を使用して、必要なものを印刷することができます。お役に立てれば。

Pyodbc 3.0.7では、pyodbc.ProgrammingError(および、私は試していませんが、おそらく他のエラータイプ)をキャッチすることは問題なく機能します。ただし、エラーの内容は依然として不可解なものであるため、エラーをよりきめ細かく処理するのは難しい場合があります。

2
aldel

これにより、myodbcを使用してmssqlに接続するときに、より明確で読みやすいエラーメッセージが表示されます。

try:
    cnxn = pyodbc.connect(...)
except pyodbc.Error as ex:
    sqlstate = ex.args[1]
    sqlstate = sqlstate.split(".")
    print(sqlstate[-3])
0
Milad Saeedi