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()提出AttributeError. 但无论如何,您不必多次调用dbObject.delete()

于 2012-11-17T19:05:59.997 回答
0

简单 - 这取决于。如果您确定会遇到什么异常,您可以坚持使用 1),坦率地说,90% 的情况都是如此。如果您知道许多代码例程可以引发相同的异常类型,则第二种方法很有用。

于 2012-11-17T19:08:56.967 回答
-1

我更喜欢使用带有验证的 dicts 的 get 方法,而不是捕获 KeyError。

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

这不是“通用”解决方案(请参阅我的回答的评论),但在这种情况下它会有所帮助。

在第一种情况下,我不明白,为什么你要删除两次。

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 回答