17

ですから、try except ステートメントの正しい書き方を知りたいのです。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、ネストされたブロックを使用します。特定の行ステートメントで例外が発生します。

どこかにエラーがある場合は、喜んでお知らせします。

4

3 に答える 3

5

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

于 2012-11-17T19:05:59.997 に答える
0

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

于 2012-11-17T19:08:56.967 に答える
-1

KeyError をキャッチする代わりに、検証を伴う辞書の get メソッドを使用することを好みます。

itemCode = items.get("itemCode") # itemCode will be None, if no such key
if itemCode is not None:
    print "code missing"

これは「一般的な」解決策ではありません(私の回答へのコメントを参照してください)が、この場合は役に立ちます。

そして、最初のケースでは、なぜあなたが2回削除しようとしているのか理解できません。

try:
    itemCode = items.get("itemCode") # itemCode will be None, if no such key
    if itemCode is not None:
        print "code missing"
    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 StandardError as ex:    # good idea to be prepared to handle various fails
    print "Unexpected error deleting item {}".format(ex)

また、python には finally セクションがあることを忘れないでください。時々重宝することが多いです。

于 2012-11-17T19:02:33.970 に答える