Как использовать try, except, else правильно в Python
Итак, я хочу знать, какой правильный способ написать try except statements. Я новичок в обработке ошибок в Python.
Вариант 1
try:
itemCode = items["itemCode"]
dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get()
dbObject.delete()
except AttributeError:
print "There 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 no item with that code"
except:
print "Unknow error"
Вариант 3
Любой другой лучший вариант, о котором вы можете подумать.
Вариант 1, мы видим, что я завершаю весь код в блоке try.
Вариант 2, он использует вложенные блоки. Это вызывает исключение в конкретных операторах строки.
Если там где-нибудь ошибка, я буду рад узнать об этом.
Ответы
Ответ 1
Из zen python "квартира лучше, чем вложенная". Я бы пошел в стиле Option # 1 в общем, хотя я немного смущен относительно того, поднимает ли dbObject=db.GqlQuery("SELECT....
или dbObject.delete()
AttributeError
. В любом случае, вам больше не нужно будет вызывать dbObject.delete()
.
Ответ 2
Простой - это зависит. Если вы уверены в том, какие исключения вы получите, вы можете придерживаться 1), и, честно говоря, это случай 90% времени. Второй способ полезен, если вы знаете, что многие подпрограммы кода могут поднять один и тот же тип исключения.
Ответ 3
Вместо того, чтобы ловить KeyError, я предпочитаю использовать метод get dicts с проверкой.
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 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 имеет окончательный раздел. Иногда это бывает полезно.