私は次のコードを試しました、
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は常に空であることがわかりました。エラーのメッセージだけを取得するにはどうすればよいですか。
ありがとう
pyodbcは、基礎となるODBC実装からのエラー/例外をラップしているように見えるため、これを実行できる可能性はほとんどありません。
これは私のために働いた。
_ 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(および、私は試していませんが、おそらく他のエラータイプ)をキャッチすることは問題なく機能します。ただし、エラーの内容は依然として不可解なものであるため、エラーをよりきめ細かく処理するのは難しい場合があります。
これにより、myodbcを使用してmssqlに接続するときに、より明確で読みやすいエラーメッセージが表示されます。
try:
cnxn = pyodbc.connect(...)
except pyodbc.Error as ex:
sqlstate = ex.args[1]
sqlstate = sqlstate.split(".")
print(sqlstate[-3])