2009-05-08 21 views
0

私のアプリケーションで、テーブルが存在しないか、適切なアクションを実行する行がないかどうかを認識する必要があります。この2つのエラーを別々にキャッチすることはできますか? Python documentationからPython:ODBC例外処理

>>>cursor.execute("delete from TABLE") 

Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
dbi.internal-error: [IBM][CLI Driver][DB2] SQL0100W No row was found for FETCH, UPDATE or DELETE; or the result of a query is an empty table. SQLSTATE=02000 
in EXEC 

OR

Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
dbi.program-error: [IBM][CLI Driver][DB2] SQL0204N "SK77531.TCS_EXCEPTIONS" is an undefined name. SQLSTATE=42704 
in EXEC 

答えて

0

A try statement may have more than one except clause, to specify handlers for different exceptions.

例えば:

try: 
    do_something_crazy 
except AttributeError: 
    print 'there was an AttributeError' 
except NameError: 
    print 'there was a NameError' 
except: 
print 'something else failed miserably' 

キャッチオールこちらとして機能を除く最後の、そして唯一のですexceptioが実行された場合nはAttributeErrorまたはNameErrorとは異なります。プロダクションコードでは、このようなcatch-all except節から明確に操作することをお勧めします。なぜなら、一般的には、予期しないエラーが発生したときにコードが失敗してしまうからです。

特定のケースでは、dbiモジュールから発生する可能性のあるさまざまな例外をインポートする必要があります。そのため、異なるexcept節でそれらをチェックすることができます。

したがって、このような何か:

# No idea if this is the right import, but they should be somewhere in that module 
import dbi 

try: 
    cursor.execute("delete from TABLE") 
except dbi.internal-error: 
    print 'internal-error' 
except dbi.program-error: 
    print 'program-error' 

あなたは上記ライニングドキュメントページでわかるように、あなたが句を除く各帰属追加を含めることを選ぶことができます。そうすることで、同じクラスの2つの異なる例外を区別する必要があるときに、実際のエラーオブジェクトにアクセスすることができます。このような細かいレベルの区別が必要ない場合でも、あなたが実際に対処していると思われるエラーを実際に処理しているかどうかを確認するために、上記のチェックよりももう少しチェックを行うことをお勧めします。

私が本当にお勧めしたいのは、あなたがそれと対話しようとする前に、テーブルが存在するかどうかをチェックするために使用しているデータベースライブラリコードのメソッドを検索することです。構造化されたtry/exceptsは、外部の入力をチェックして浄化する必要がある場合に非常に便利ですが、データベーステーブルの仮の存在を念頭に置いてコーディングすると、

+0

ご回答いただきありがとうございます。私はあなたの最後の例を試してみました。 AttributeError: 'module'オブジェクトに 'internal'属性がありません しかし、私はdbi atributes progErrorとinternalErrorで作業しました。ありがとう – Richard