web-dev-qa-db-ja.com

Python)で正しくない場合を除いて、tryの使用方法

だから私はどちらがtryexceptステートメントを書く正しい方法であるか知りたいです。 Pythonでのエラー処理は初めてです。

オプション1

try:
    itemCode = items["itemCode"]
    dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get()
    dbObject.delete() 
except AttributeError:
    print "There's no item with that code"
except KeyError:
    print "Bad parameter name"
except:
    print "Unknow error" 

オプション2

try:
    itemCode = items["itemCode"]
except KeyError:
    print "Bad parameter name"
else:    
    dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get()
    try:    
        dbObject.delete() 
    except AttributeError:
        print "There's no item with that code"
    except:
        print "Unknow error" 

オプション3あなたが考えることができる他のより良いオプション。

オプション1、すべてのコードをtryブロックでラップしていることがわかります。オプション2、ネストされたブロックを使用します。特定の行ステートメントで例外が発生します。

どこかにエラーがあれば、喜んでお知らせします。

13
john.dou.2011

Pythonの禅から、「フラットはネストよりも優れています」。 _dbObject=db.GqlQuery("SELECT...._またはdbObject.delete()AttributeErrorを発生させるかどうかについては少し混乱していますが、一般的にはオプション#1スタイルを使用します。ただし、いずれの場合でも、dbObject.delete()を複数回呼び出す必要はありません。

5
gnr

シンプル-状況によります。発生する例外について確信がある場合は、1)に固執することができます。率直に言って、90%の確率でそうです。 2番目の方法は、多くのコードルーチンが同じ例外タイプを発生させる可能性があることがわかっている場合に役立ちます。

0
Red