所以我想知道哪个是编写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,它使用嵌套块。它在特定的行语句上引发了一个例外。
如果某处出现错误,我会很高兴知道它。
答案 0 :(得分:4)
从蟒蛇的禅宗来看,“扁平比嵌套更好”。我一般会使用选项#1样式,但我对dbObject=db.GqlQuery("SELECT....
或dbObject.delete()
是否会引发AttributeError
感到有些困惑。但无论如何,您不必多次拨打dbObject.delete()
。
答案 1 :(得分:0)
简单 - 这取决于。如果你确定你会得到什么例外,你可以坚持1)坦率地说,90%的情况都是如此。如果您知道许多代码例程可以引发相同的异常类型,则第二种方法很有用。
答案 2 :(得分:-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最后有部分。它有时会派上用场。