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

joh*_*011 13 python exception python-2.7

所以我想知道哪个是写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" 
Run Code Online (Sandbox Code Playgroud)

选项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" 
Run Code Online (Sandbox Code Playgroud)

选项3您可以想到的任何其他更好的选择.

选项1,我们看到我将所有代码都包装在try块中.选项2,它使用嵌套块.它在特定的行语句上引发了一个例外.

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

gnr*_*gnr 5

从python的禅宗来看,“扁平比嵌套好。” 我会跟选项#去一般1样式,虽然我有点困惑,是否dbObject=db.GqlQuery("SELECT....dbObject.delete()引发AttributeError。无论如何,您都不必多次调用dbObject.delete()


cle*_*leg -1

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

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

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

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

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)
Run Code Online (Sandbox Code Playgroud)

另外,不要忘记 python 有finally 部分。有时它经常派上用场。

  • 这不是一种非常 Pythonic 的方法,因为当 `items['itemCode']` 为 `0`、`False`、`[]`、`{}` 或任何其他计算结果为 `False 的内容时,您的代码会失败`。在这种情况下,首选 `try`/` except`,因为它实际上捕获了未找到该项目的特定情况。不会出现“if not itemCode”可能产生的误报。 (2认同)