Jakie jest zamierzone zastosowanie opcjonalnej else
klauzuli try
oświadczenia?
python
exception-handling
geowa4
źródło
źródło
Odpowiedzi:
Instrukcje w
else
bloku są wykonywane, jeśli wykonanie nie powiedzie siętry
- jeśli nie było wyjątku. Szczerze mówiąc, nigdy nie znalazłem potrzeby.Jednak uwagi na temat obsługi wyjątków :
Tak więc, jeśli masz metodę, która może na przykład rzucić an
IOError
, i chcesz wychwycić wyjątki, które ona wywołuje, ale jest coś innego, co chcesz zrobić, jeśli pierwsza operacja się powiedzie, i nie chcesz wychwycić błędu IOError z podczas tej operacji możesz napisać coś takiego:Jeśli po prostu wstawisz
another_operation_that_can_throw_ioerror()
późniejoperation_that_can_throw_ioerror
,except
złapie błędy drugiego połączenia. A jeśli umieścisz go po całymtry
bloku, zawsze będzie uruchamiany, i dopiero pofinally
.else
Pozwala upewnićfinally
blokiem iIOError
podniesione przez niego przedmioty nie są tutaj łapaneźródło
return
,continue
lubbreak
.Jest jeden duży powód do użycia
else
- styl i czytelność. Zasadniczo dobrym pomysłem jest przechowywanie kodu, który może powodować wyjątki w pobliżu kodu, który się nimi zajmuje. Na przykład porównaj te:i
Drugi jest dobry, gdy
except
nie można wrócić wcześniej lub ponownie rzucić wyjątek. Jeśli to możliwe, napisałbym:Uwaga: Odpowiedź skopiowana z ostatnio opublikowanego duplikatu tutaj , stąd wszystkie te rzeczy „AskPassword”.
źródło
Jedno zastosowanie: przetestuj kod, który powinien zgłosić wyjątek.
(Ten kod należy streścić w bardziej ogólny test w praktyce).
źródło
Zamierzonym zastosowaniem jest kontekst, w którym można uruchomić więcej kodu, jeśli nie ma wyjątków, w których oczekiwano, że będzie on obsługiwany.
Ten kontekst pozwala uniknąć przypadkowej obsługi błędów, których się nie spodziewałeś.
Ale ważne jest, aby zrozumieć, o dokładnych warunkach, które powodują jeszcze klauzuli do biegu, ponieważ
return
,continue
ibreak
może przerwać przepływ sterowania doelse
.W podsumowaniu
else
Oświadczenie biegnie jeśli istnieją żadne wyjątki, a jeśli nie przerywareturn
,continue
lubbreak
oświadczenia.W innych odpowiedziach brakuje tej ostatniej części.
Z dokumentów:
(Dodano pogrubienie.) A przypis brzmi:
Wymaga co najmniej jednego poprzedzającego zdania z wyjątkiem klauzuli ( patrz gramatyka ). Więc tak naprawdę to nie jest „try-else”, to „try-else-else (-finally)” z
else
(ifinally
) są opcjonalne.W Python Tutorial omawia jego wykorzystania:
Przykład różnicowania
else
kodu w zależności odtry
blokuJeśli obsłużysz błąd,
else
blok nie będzie działał. Na przykład:I teraz,
źródło
Try-else-else jest świetny do łączenia wzoru EAFP z pisaniem kaczek :
Być może ten naiwny kod jest w porządku:
To świetny sposób na przypadkowe ukrycie poważnych błędów w kodzie. Napisałem tam porządek, ale błąd AttributeError, który dałby mi znać, został połknięty. Co gorsza, co jeśli napisałbym go poprawnie, ale metoda czyszczenia była czasami przekazywana typowi użytkownika, który miał błędnie nazwany atrybut, powodując, że po cichu zawodzi w połowie i pozostawia plik niezamknięty? Powodzenia w debugowaniu tego.
źródło
Uważam, że jest to bardzo przydatne, gdy masz porządek, aby to zrobić, nawet jeśli istnieje wyjątek:
źródło
Chociaż nie możesz teraz wymyślić zastosowania, możesz się założyć, że musi to być użyteczne. Oto niewyobrażalna próbka:
Z
else
:Bez
else
:Tutaj masz
something
zdefiniowaną zmienną, jeśli nie zostanie zgłoszony błąd. Możesz usunąć to pozatry
blokiem, ale wymaga to pewnego niechlujnego wykrycia, jeśli zmienna jest zdefiniowana.źródło
something = a[2]; print something
środku try: block?Jest ładny przykład
try-else
w PEP 380 . Zasadniczo sprowadza się to do obsługi różnych wyjątków w różnych częściach algorytmu.To jest coś takiego:
Umożliwia to zapisanie kodu obsługi wyjątku bliżej miejsca wystąpienia wyjątku.
źródło
Od błędów i wyjątków # Obsługa wyjątków - docs.python.org
źródło
Patrząc na odniesienie do Pythona , wydaje się, że
else
jest wykonywane po,try
gdy nie ma wyjątku. Opcjonalna klauzula else jest wykonywana, gdy kontrola wypływa z końca klauzuli try. 2 Wyjątki w klauzuli else nie są obsługiwane przez poprzednie klauzule oprócz.Zanurz się w pythonie ma przykład, w którym, jeśli dobrze rozumiem, w
try
bloku próbują zaimportować moduł, gdy to się nie powiedzie, otrzymasz wyjątek i powiąż domyślnie, ale gdy to działa, masz opcję, aby przejść doelse
bloku i powiązania tego, co jest wymagane (zobacz link do przykładu i objaśnienia).Jeśli spróbujesz wykonać pracę w
catch
bloku, może to rzucić kolejny wyjątek - myślę, że właśnie tamelse
przydatny jest blok.źródło
try
bloku.Otóż to. Blok „else” klauzuli try-wyjątkiem istnieje dla kodu, który jest uruchamiany, gdy (i tylko wtedy), gdy próba się powiedzie. Można go używać i nadużywać.
Osobiście podoba mi się i używam go w razie potrzeby. Semantycznie grupuje instrukcje.
źródło
Być może zastosowanie może być:
Może to też przyniesie ci korzyść.
źródło
Znalazłem
try: ... else:
konstrukcję przydatną w sytuacji, gdy uruchamiasz zapytania do bazy danych i logujesz wyniki tych zapytań do osobnej bazy danych tego samego typu / smaku. Załóżmy, że mam wiele wątków roboczych wszystkich zapytań do bazy danych przesłanych do kolejkiOczywiście, jeśli potrafisz rozróżnić możliwe wyjątki, które mogą zostać zgłoszone, nie musisz tego używać, ale jeśli kod reagujący na udany fragment kodu może zgłosić ten sam wyjątek, co udany fragment, i nie możesz po prostu puść drugi możliwy wyjątek lub natychmiast powróć po sukcesie (co w moim przypadku zabiłoby wątek), to się przydaje.
źródło
else
Blok może często występować jako uzupełnienie funkcjonalności, który występuje w każdymexcept
bloku.W tym przypadku
inconsistency_type
ustawiana jest w każdym bloku oprócz bloku, dzięki czemu zachowanie jest uzupełniane w przypadku braku błędu welse
.Oczywiście opisuję to jako wzorzec, który może kiedyś pojawić się w twoim kodzie. W tym konkretnym przypadku po prostu ustawiasz
inconsistency_type
0 przedtry
blokiem.źródło
Oto inne miejsce, w którym lubię używać tego wzoru:
źródło
continue
- wzorca „wcześnie się wydostać”. Pozwala to na usunięcie klauzuli „else” i jej wcięcia, dzięki czemu kod jest łatwiejszy do odczytania.Jednym ze scenariuszy użycia, który mogę wymyślić, są nieprzewidywalne wyjątki, które można obejść, jeśli spróbujesz ponownie. Na przykład, gdy operacje w bloku try obejmują losowe liczby:
Ale jeśli można przewidzieć wyjątek, zawsze należy wcześniej wybrać walidację zamiast wyjątku. Jednak nie wszystko można przewidzieć, więc ten wzorzec kodu ma swoje miejsce.
źródło
break
wnętrzetry
na końcu, co jest czystszym IMO, i nie potrzebujeszelse
. Równieżcontinue
nie jest tak naprawdę potrzebne, możesz po prostupass
.Uznałem, że
else
przydatne jest postępowanie z potencjalnie niepoprawnym plikiem konfiguracyjnym:Wyjątek czytający
lock
config wyłącza monitorowanie blokady, a ValueErrors rejestruje pomocny komunikat ostrzegawczy.źródło
Załóżmy, że logika programowania zależy od tego, czy słownik zawiera wpis z danym kluczem. Możesz przetestować wynik
dict.get(key)
użyciaif... else...
konstruktu lub możesz:źródło
Dodałbym inny przypadek użycia, który wydaje się prosty podczas obsługi sesji DB:
źródło
else:
Blok jest mylące i (prawie) bezużyteczne. Jest to również część instrukcjifor
iwhile
.W rzeczywistości, nawet na podstawie oświadczenia
if
,else:
można je nadużywać w naprawdę okropny sposób, tworząc bardzo trudne do znalezienia błędy.Rozważ to.
Pomyśl dwa razy
else:
. To generalnie problem. Unikaj tego, z wyjątkiem instrukcjiif
-state, a nawet rozważ udokumentowanieelse
warunku, aby wyrazić to wyraźnie.źródło
if x > 0: return "yes"
iif x <= 0: return "no"
. Teraz ktoś przychodzi i zmienia jeden z warunków,x > 1
ale zapomina zmienić drugi. Jaka jest ta redukcja liczby błędów, które zostałyby popełnione.if else
klauzule mają czasem wiele wierszy od siebie. SUSZENIE to dobra praktyka, o wiele częściej niż nie. (przepraszam za podwójny post).