Подтвердить что ты не робот

Как использовать 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, он использует вложенные блоки. Это вызывает исключение в конкретных операторах строки.

Если там где-нибудь ошибка, я буду рад узнать об этом.

4b9b3361

Ответ 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 имеет окончательный раздел. Иногда это бывает полезно.