Wiem, że mogę:
try:
# do something that may fail
except:
# do this if ANYTHING goes wrong
Mogę też to zrobić:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreTooShortException:
# stand on a ladder
Ale jeśli chcę zrobić to samo w ramach dwóch różnych wyjątków, najlepsze, co mogę teraz wymyślić, to zrobić:
try:
# do something that may fail
except IDontLikeYouException:
# say please
except YouAreBeingMeanException:
# say please
Czy jest jakiś sposób, aby zrobić coś takiego (ponieważ działanie w obu wyjątkach to say please
):
try:
# do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
# say please
Teraz to naprawdę nie zadziała, ponieważ pasuje do składni:
try:
# do something that may fail
except Exception, e:
# say please
Tak więc mój wysiłek, aby uchwycić dwa wyjątki, nie do końca się udaje.
Czy jest na to sposób?
python
exception
exception-handling
inspectorG4dget
źródło
źródło
Odpowiedzi:
Z dokumentacji Python :
Lub tylko dla Python 2:
Oddzielenie wyjątku od zmiennej przecinkiem będzie nadal działać w Pythonie 2.6 i 2.7, ale teraz jest przestarzałe i nie działa w Pythonie 3; teraz powinieneś używać
as
.źródło
list
, i to spowodowałoTypeError
. Wygląda na to, że błędy muszą występować wtuple
celu poprawnego działania zgodnie z oczekiwaniami.except
wierszu. Jest koniecznie nawiasowany tylko, jeśli zostanie utworzony wexcept
linii.2 + (x * 2)
,(x * 2)
z pewnością nie jest krotka. Nawiasy są ogólną konstrukcją grupującą. Cechą charakterystyczną krotki jest to, że zawiera przecinek - patrz dokumentacja Pythona : „Zauważ, że to przecinek tworzy krotkę, a nie nawiasy”.Zrób to:
Nawiasy są wymagane ze względu na starszą składnię, która używała przecinków do przypisywania obiektu błędu do nazwy. Słowo
as
kluczowe służy do przypisania. Możesz użyć dowolnej nazwy dla obiektu błędu, wolęerror
osobiście.Najlepsze praktyki
Aby to zrobić w sposób obecnie zgodny i zgodny z Pythonem, musisz oddzielić wyjątki przecinkami i owinąć je nawiasami, aby odróżnić je od wcześniejszej składni, która przypisała wystąpienie wyjątku do nazwy zmiennej, postępując zgodnie z typem wyjątku, który ma zostać przechwycony za pomocą przecinek.
Oto przykład prostego użycia:
Podaję tylko te wyjątki, aby uniknąć ukrywania błędów, które, jeśli napotkam, oczekują śladu pełnego stosu.
Jest to udokumentowane tutaj: https://docs.python.org/tutorial/errors.html
Możesz przypisać wyjątek do zmiennej (
e
jest powszechny, ale możesz preferować bardziej szczegółową zmienną, jeśli masz długą obsługę wyjątków lub twoje IDE podświetla tylko wybory większe niż to, co moje). Instancja ma atrybut args. Oto przykład:Zauważ, że w Pythonie 3
err
obiekt nie wchodzi w zakres po zakończeniuexcept
bloku.Przestarzałe
Możesz zobaczyć kod, który przypisuje błąd przecinkiem. To użycie, jedyna forma dostępna w Pythonie 2.5 i wcześniejszych, jest przestarzała, a jeśli chcesz, aby Twój kod był zgodny w przód w Pythonie 3, powinieneś zaktualizować składnię, aby używać nowej formy:
Jeśli widzisz przypisanie nazwy przecinka w swojej bazie kodu i używasz języka Python 2.5 lub nowszego, przełącz się na nowy sposób, aby kod był zgodny podczas aktualizacji.
suppress
Kierownik kontekstAkceptowana odpowiedź to tak naprawdę 4 linie kodu, minimum:
try
,except
,pass
Linie mogą być obsługiwane w jednej linii z menedżerem kontekstowego zatajania dostępnych w Pythonie 3.4 :Więc jeśli chcesz, z
pass
pewnymi wyjątkami, użyjsuppress
.źródło
suppress
, dużo bardziej czytelny niż po prostu robipass
naexcept
Z dokumentacji Pythona -> 8.3 Obsługa wyjątków :
źródło
Jeśli często używasz dużej liczby wyjątków, możesz wstępnie zdefiniować krotkę, aby nie trzeba było jej wielokrotnie wpisywać.
UWAGI:
Jeśli musisz także złapać inne wyjątki niż te w predefiniowanym krotce, musisz zdefiniować inny wyjątek oprócz bloku.
Jeśli po prostu nie tolerujesz zmiennej globalnej, zdefiniuj ją w main () i przekaż ją w razie potrzeby ...
źródło
Jednym ze sposobów na to jest ..
a innym sposobem jest stworzenie metody wykonującej zadanie wykonywane przez
except
blok i wywołanie go przez całyexcept
blok, który piszesz ..Wiem, że drugi nie jest najlepszym sposobem na zrobienie tego, ale pokazuję tylko kilka sposobów na zrobienie tego.
źródło
except
klauzul jest jednak normalne, gdy chcesz inaczej obsługiwać wyjątki.