Jak wychwycić wiele wyjątków w Pythonie: prosty przewodnik

Ł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.

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ć.