2012-11-17 9 views
12

Więc chcę wiedzieć, który jest właściwy sposób wypróbować, z wyjątkiem instrukcji. Jestem nowy w obsłudze błędów w Pythonie.Jak używać spróbuj, z wyjątkiem, w przeciwnym razie poprawnie w Python

Wariant 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" 

Wariant 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" 

Wariant 3 Wszelkie inne lepszym rozwiązaniem można myśleć.

Opcja 1, widzimy, że zawijam cały kod w bloku try. Opcja 2, wykorzystuje zagnieżdżone bloki. Podnosi wyjątek w odniesieniu do określonych instrukcji linii.

Jeśli pojawi się błąd, chętnie się o tym dowiem.

+0

Nie w pełni rozumiem twoje pytanie. Wydaje mi się, że twoim głównym problemem jest zrozumienie, jak próbujesz, z wyjątkiem tego, że w końcu działa. Czy to jest poprawne? Jeśli tak, mogę podać przykład, który to wyjaśnia. – inspectorG4dget

+0

@ inspectorG4dget - Wydaje mi się, że pytanie dotyczy mniej tego, jak działają (oba przykłady są prawidłowe) i pytania o preferencje stylistyczne. –

+0

Nie rozumiem, dlaczego usuwasz obiekt w bloku '' try: '' i '' else: '', czy brakuje mi czegoś lub czy to nie ma sensu? –

Odpowiedz

-1

Zamiast łapać KeyError, wolę używać metody get dyktowania z walidacją.

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

To nie jest „ogólne” rozwiązanie (patrz komentarze do mojej odpowiedzi), ale w tym przypadku to pomoże.

W pierwszym przypadku nie rozumiem, dlaczego próbujesz usunąć dwa razy.

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) 

A także, nie zapomnij, że pyton ma w końcu sekcję. Czasami przydaje się oftem.

+2

To nie jest podejście bardzo Pythoniczne, ponieważ twój kod zawodzi, gdy 'items ['itemCode']' to '0',' False', '[]', '{}' lub cokolwiek innego, co ocenia '. Fałsz ". 'try' /' except' jest w tej sytuacji bardzo preferowany, ponieważ faktycznie przechwytuje określony przypadek, w którym element nie został znaleziony. Nie ma fałszywych alarmów, które "jeśli nie itemCode" mogą spowodować. –

+0

Tak, bardzo mi przykro, to mój błąd (bardzo zmęczony i starałem się szybko odpowiedzieć). Oczywiście, 'jest Brak' i' nie jest Brak' powinno być zawsze używane do sprawdzenia, czy wartość jest Brak (lub nie jest). Poprawiłem kod. – cleg

+0

Bez przeprosin.Wszyscy tutaj próbujemy razem pracować nad tymi rzeczami. :-) Ale nawet w nowym kodzie nie można odróżnić "itemCode" nie w itemach, a "items [" itemcode "] to None'. 'None' jest doskonale poprawną wartością do przechowywania i istnieje duża różnica między' None' i 'KeyError'. –

4

Z zenu Pythona "mieszkanie jest lepsze niż zagnieżdżone". Zwykle korzystam z stylu opcji nr 1, ale jestem nieco zdezorientowany, czy dbObject=db.GqlQuery("SELECT.... lub dbObject.delete() podnosi AttributeError. W każdym razie nie powinieneś zadzwonić na numer dbObject.delete() więcej niż jeden raz.

+0

moje złe, naprawiłem podwójne usuwanie. dbObject.delete() podnosi AttributeError –

+0

Nie jest dobrym pomysłem, aby przechwycić wszystkie błędy i ukryć je za pomocą prostego komunikatu "nieznany błąd". Trudno zrozumieć, co się stało, gdy pojawi się taki komunikat o błędzie. – cleg

+0

@ cleg to za błędy, o których nie wiem. Kiedy nadejdą, złapię je –

0

Proste - to zależy. Jeśli masz pewność co do wyjątków, które otrzymasz, możesz trzymać się 1) i szczerze mówiąc, jest to w 90% przypadków. Drugi sposób jest przydatny, jeśli wiesz, że wiele procedur kodu może wywołać ten sam typ wyjątku.

Powiązane problemy