繁体   English   中英

如何使用try,除了,否则在Python中正确使用

[英]How to use try, except, else correctly in Python

所以我想知道哪个是写try try语句的正确方法。 我是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,它使用嵌套块。 它在特定的行语句上引发了一个例外。

如果在某处出现错误,我将很高兴知道它。

从蟒蛇的禅宗来看,“扁平比嵌套好”。 我一般会使用选项#1样式,虽然我对dbObject=db.GqlQuery("SELECT....dbObject.delete()引发AttributeError有点困惑。但无论如何,你不应该多次调用dbObject.delete()

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

我更喜欢使用带有验证的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最终有部分。 它有时会派上用场。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM