Jak wychwycić wiele wyjątków w jednym wierszu (oprócz bloku)
Zrób to:
try:
may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
handle(error) # might log or have some other default behavior...
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
sys.exit(0)
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError) as err:
print(err)
print(err.args)
sys.exit(0)
Zauważ, że w Pythonie 3 err
obiekt nie wchodzi w zakres po zakończeniu except
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:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
print err
print err.args
sys.exit(0)
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 kontekst
Akceptowana odpowiedź to tak naprawdę 4 linie kodu, minimum:
try:
do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
pass
try
, except
, pass
Linie mogą być obsługiwane w jednej linii z menedżerem kontekstowego zatajania dostępnych w Pythonie 3.4 :
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
Więc jeśli chcesz, z pass
pewnymi wyjątkami, użyj suppress
.