Łapanie wyjątków w Pythonie pomaga zapewnić rzadsze awarie programów. Dzięki temu Twój kod będzie bardziej niezawodny i zapewni lepsze doświadczenie użytkownika. W tym artykule omówię, jak wychwycić wiele wyjątków w tym samym bloku try/except w Pythonie.
Spis treści:
Jakie są wyjątki w Pythonie?
W Pyton, Wyjątki to mechanizm komunikacji pomiędzy różnymi częściami programu. Ten mechanizm komunikacji umożliwia jednej części systemu zakomunikowanie, że napotkała błąd krytyczny, z którym nie wie, jak sobie poradzić.
Zgłasza więc wyjątek. Inna część programu, która wie, jak obsłużyć błąd, przechwyci wyjątek i poprawnie obsłuży błąd.
Jeśli nie zostaną obsłużone, wyjątki spowodują awarię programu. Dlatego obsługa wyjątków zapobiega awariom programu i czyni go bardziej niezawodnym.
Na potrzeby tego artykułu zakładam, że znasz już podstawy zgłaszania i obsługi wyjątków, które opisano w artykule „Wprowadzenie do Pythona Try/Except”.
Znaczenie obsługi wielu wyjątków w Pythonie
- Zmniejsza to duplikację kodu, ponieważ wiele wyjątków jest obsługiwanych przez ten sam blok. Dzięki temu kod jest łatwiejszy do odczytania, edycji i usunięcia.
- Pomaga także w pisaniu bardziej wydajnego kodu, ponieważ typ błędu trzeba sprawdzać tylko raz, a nie kilka razy.
Obsługa wielu wyjątków
Przechwytywanie wielu wyjątków odnosi się do sytuacji, w której przechwytywanych jest wiele wyjątków przy użyciu tego samego bloku z wyjątkiem. W Pythonie możesz wychwytywać różne wyjątki w poszczególnych blokach z wyjątkiem.
Alternatywnie, jeśli chcesz obsłużyć wyjątki w podobny sposób, możesz obsłużyć je za pomocą jednego bloku. Aby to zrobić, musisz przechwycić wiele wyjątków. W tej sekcji wyjaśnię, jak to zrobić na przykładzie.
#1. Łapanie różnych wyjątków w różnych blokach
Załóżmy, że mamy program zaprojektowany tak, aby przyjmować dwie różne wartości i je dzielić. Przewidujemy, że w tym programie zgłaszane będą różne typy wyjątków, gdy użytkownik wprowadzi nieprawidłowe wartości. W szczególności chcemy obsłużyć ValueError i ZeroDivisionError.
Błąd ValueError zostanie wywołany, gdy użytkownik wprowadzi wartość, której nie można przekonwertować na liczbę całkowitą. Błąd ZeroDivisionError zostanie zgłoszony, gdy druga liczba będzie równa zero. W obu przypadkach chcemy wyświetlić komunikat o błędzie „Wpisałeś nieprawidłową wartość”.
Aby wykonać powyższe, możemy napisać następujący kod:
try: dividend = int(input('Enter first num: ')) divisor = int(input('Enter second num: ')) quotient = dividend / divisor print(quotient) except ValueError as e: print("You entered an invalid value") except ZeroDivisionError as e: print("You entered an invalid value") except Exception as e: print("Something went wrong")
Jeśli uruchomimy powyższy kod i tekst, którego nie można przekonwertować na liczbę całkowitą, będzie to wynik:
A gdybyśmy wprowadzili drugą liczbę jako 0, byłby to wynik:
Kod działa zgodnie z oczekiwaniami, ale zauważ, że z wartościami ValueError i ZeroDivisionError postępujemy podobnie. Zatem pomiędzy dwoma blokami z wyjątkiem jest dużo duplikacji kodu. Nie jest to idealne rozwiązanie, ponieważ w programowaniu łamiemy zasadę DRY. Zasada DRY mówi: „Nie powtarzaj się”.
Zamiast więc pisać kod osobno, możemy połączyć dwa bloki w jeden, który wychwytuje wiele wyjątków. Jeśli to zrobimy, unikniemy powtórzeń.
#2. Przechwytywanie wielu wyjątków w jednym bloku wyjątkiem
Aby wychwycić wiele wyjątków, udostępniamy krotkę określającą wszystkie błędy, które chcemy przechwycić. Oto przykład, w którym przechwytujemy zarówno ValueError, jak i ZeroDivisionError w jednym bloku wyjątkiem:
try: dividend = int(input('Enter first num: ')) divisor = int(input('Enter second num: ')) quotient = dividend / divisor print(quotient) except (ValueError, ZeroDivisionError) as e: print("You entered an invalid value") except Exception as e: print("Something went wrong")
Jest to znacznie lepsza implementacja niż poprzedni kod. Zasadniczo na tym polega obsługa wielu wyjątków. Powyższy kod działa w taki sam sposób jak poprzednio. Jeśli testujesz przy użyciu poprzednich przykładów, powinno działać jak poprzednio:
#3. Identyfikowanie, który wyjątek został przechwycony
Powyższy kod wykonuje pierwszy blok z wyjątkiem, gdy zostanie przechwycony błąd ValueError lub ZeroDivisionError. W niektórych przypadkach możesz mieć kod, który chcesz wykonać dla obu błędów, i inny kod, który chcesz wykonać dla jednego, ale nie drugiego błędu.
W takim przypadku należy najpierw zidentyfikować jaki błąd został przechwycony i wykonać odpowiedni kod.
Aby określić, który wyjątek został przechwycony, możesz użyć bloku if/else wewnątrz bloku z wyjątkiem. Na przykład:
try: dividend = int(input('Enter first num: ')) divisor = int(input('Enter second num: ')) quotient = dividend / divisor print(quotient) except (ValueError, ZeroDivisionError) as e: print("You entered an invalid value") if isinstance(e, ValueError): print('Value Error') else: print('Zero Division Error') except Exception as e: print("Something went wrong")
W tym bloku oprócz wydrukowania ogólnego komunikatu o błędzie zarówno dla ValueError, jak i ZeroDivisionError, sprawdzamy również dokładnie, jakiego rodzaju błąd wyłapaliśmy i drukujemy dodatkowy komunikat. Jeśli ponownie przetestujemy kod, powinniśmy zobaczyć dodatkowe komunikaty specyficzne dla przechwyconego wyjątku.
Kiedy chciałbyś obsługiwać wiele wyjątków?
W ogólnym przypadku obsługa wielu wyjątków jest idealna, gdy chcesz wykonać ten sam kod dla podobnych wyjątków, które mogą zostać zgłoszone. Obejmuje to:
- Żądania sieciowe, które nie powiodły się z różnych powodów. Niezależnie od tego możesz chcieć powiadomić użytkownika, że nie można uzyskać dostępu do serwera.
- Nieudane połączenia z bazą danych, które powodują wiele błędów. Chociaż te błędy mogą się różnić, obsługa może być taka sama.
- Operacje we/wy plików powodują również błędy, które można obsłużyć w podobny sposób, takie jak błędy uprawnień i zapełnienia dysku.
Wniosek
W tym artykule omówiono łączenie wielu bloków z wyjątkiem w jeden poprzez jednoczesne przechwytywanie wielu wyjątków. Dzięki temu Twój kod stanie się bardziej czytelny i łatwiejszy w utrzymaniu. Następnie możesz przeczytać ten artykuł na temat projektów dla początkujących w Pythonie, które powinieneś wypróbować.