logo

Obsługa wyjątków w Pythonie

Do tej pory badaliśmy podstawowy język Pythona od zestawu 1 do 4 ( Zestaw 1 | Zestaw 2 | Zestaw 3 | Zestaw 4 ).

W tym artykule omówimy, jak obsługiwać wyjątki w Pythonie za pomocą instrukcji try, z wyjątkiem i wreszcie, za pomocą odpowiednich przykładów.



Błąd w Pythonie może być dwojakiego rodzaju, tj. Błędy składniowe i wyjątki . Błędy to problemy w programie, z powodu których program zatrzyma wykonywanie. Z drugiej strony wyjątki są zgłaszane, gdy mają miejsce pewne zdarzenia wewnętrzne, które zmieniają normalny przebieg programu.

Różne typy wyjątków w Pythonie:

W Pythonie istnieje kilka wbudowanych wyjątków, które można zgłosić, gdy podczas wykonywania programu wystąpi błąd. Oto niektóre z najczęstszych typów wyjątków w Pythonie:

jak przekonwertować liczbę całkowitą na ciąg znaków w Javie
  • Błąd składni: Ten wyjątek jest zgłaszany, gdy interpreter napotka błąd składniowy w kodzie, taki jak błędnie napisane słowo kluczowe, brakujący dwukropek lub niezrównoważony nawias.
  • TypBłąd : Ten wyjątek jest zgłaszany, gdy operacja lub funkcja zostanie zastosowana do obiektu niewłaściwego typu, na przykład dodając ciąg znaków do liczby całkowitej.
  • NazwaBłąd : Ten wyjątek jest zgłaszany, gdy w bieżącym zakresie nie znaleziono nazwy zmiennej lub funkcji.
  • Błąd indeksu : Ten wyjątek jest zgłaszany, gdy indeks jest poza zakresem dla listy, krotki lub innych typów sekwencji.
  • Błąd klucza : Ten wyjątek jest zgłaszany, gdy w słowniku nie znaleziono klucza.
  • Błąd wartości : Ten wyjątek jest wywoływany, gdy funkcja lub metoda jest wywoływana z nieprawidłowym argumentem lub danymi wejściowymi, na przykład podczas próby przekonwertowania ciągu na liczbę całkowitą, gdy ciąg nie reprezentuje prawidłowej liczby całkowitej.
  • Błąd atrybutu : Ten wyjątek jest zgłaszany, gdy w obiekcie nie zostanie znaleziony atrybut lub metoda, na przykład podczas próby uzyskania dostępu do nieistniejącego atrybutu instancji klasy.
  • Błąd IO : Ten wyjątek jest zgłaszany, gdy operacja we/wy, taka jak odczyt lub zapis pliku, kończy się niepowodzeniem z powodu błędu wejścia/wyjścia.
  • Błąd ZeroDivision : Ten wyjątek jest zgłaszany, gdy podejmowana jest próba podzielenia liczby przez zero.
  • Błąd importu : Ten wyjątek jest zgłaszany, gdy instrukcja importu nie może znaleźć lub załadować modułu.

To tylko kilka przykładów wielu typów wyjątków, które mogą wystąpić w Pythonie. Ważne jest, aby poprawnie obsługiwać wyjątki w kodzie za pomocą bloków try-except lub innych technik obsługi błędów, aby sprawnie obsługiwać błędy i zapobiegać awariom programu.



Różnica między błędem składniowym a wyjątkami

Błąd składni: Jak sama nazwa wskazuje, błąd ten wynika z nieprawidłowej składni w kodzie. Prowadzi to do zakończenia programu.

Przykład:

W kodzie występuje błąd składniowy. The ' if'> po wyrażeniu należy umieścić dwukropek (:>) i ' print'> instrukcja powinna być wcięta tak, aby znajdowała się wewnątrz ' if'> blok.



Python3




amount>=> 10000> if>(amount>>2999>)> print>(>'You are eligible to purchase Dsa Self Paced'>)>

>

>

Wyjście:

Wyjątki: Wyjątki są zgłaszane, gdy program jest poprawny składniowo, ale kod powoduje błąd. Ten błąd nie zatrzymuje wykonywania programu, zmienia jednak normalny przebieg programu.

Przykład:

Tutaj, w tym kodzie, dzielimy 'znaki' przez zero, więc wystąpi błąd znany jako „Błąd podziału zerowego”

Python3




marks>=> 10000> a>=> marks>/> 0> print>(a)>

>

>

Wyjście:

W powyższym przykładzie wywołano błąd ZeroDivisionError, gdy próbujemy podzielić liczbę przez 0.

Notatka: Wyjątek jest klasą bazową dla wszystkich wyjątków w Pythonie. Możesz sprawdzić hierarchię wyjątków Tutaj .

Przykład:

1) TypeError: Ten wyjątek jest zgłaszany, gdy operacja lub funkcja zostanie zastosowana do obiektu niewłaściwego typu. Oto przykład:
Tutaj „Błąd typu” jest wywoływany, ponieważ oba dodawane typy danych są różne.

Python3




x>=> 5> y>=> 'hello'> z>=> x>+> y>

>

>

output:  Traceback (most recent call last):  File '7edfa469-9a3c-4e4d-98f3-5544e60bff4e.py', line 4, in   z = x + y TypeError: unsupported operand type(s) for +: 'int' and 'str'>

spróbuj złapać blok, aby rozwiązać problem:

Kod próbuje dodać liczbę całkowitą ( ' x'> ) i ciąg znaków ( ' y'> ) razem, co nie jest prawidłową operacją i spowoduje wyświetlenie a ' TypeError'> . Zastosowany kod: a ' try'> I ' except'> block, aby przechwycić ten wyjątek i wydrukować komunikat o błędzie.

Python3




x>=> 5> y>=> 'hello'> try>:> >z>=> x>+> y> except> TypeError:> >print>(>'Error: cannot add an int and a str'>)>

>

>

Wyjście

Error: cannot add an int and a str>

Instrukcja Try and Apply – łapanie wyjątków

Instrukcje Try i z wyjątkiem służą do przechwytywania i obsługi wyjątków w Pythonie. Instrukcje, które mogą zgłaszać wyjątki, są przechowywane w klauzuli try, a instrukcje obsługujące wyjątek są zapisywane w klauzuli z wyjątkiem.

Przykład: Tutaj próbujemy uzyskać dostęp do elementu tablicy, którego indeks jest poza limitem i obsłużyć odpowiedni wyjątek.

Python3




a>=> [>1>,>2>,>3>]> try>:> >print> (>'Second element = %d'> %>(a[>1>]))> >print> (>'Fourth element = %d'> %>(a[>3>]))> except>:> >print> (>'An error occurred'>)>

>

>

Wyjście

Second element = 2 An error occurred>

W powyższym przykładzie instrukcje, które mogą powodować błąd, zostały umieszczone wewnątrz instrukcji try (w naszym przypadku drugiej instrukcji print). Druga instrukcja print próbuje uzyskać dostęp do czwartego elementu listy, którego tam nie ma, co powoduje wyjątek. Ten wyjątek jest następnie wychwytywany przez instrukcję z wyjątkiem.

Łapanie określonego wyjątku

Instrukcja try może zawierać więcej niż jedną klauzulę z wyjątkiem, aby określić procedury obsługi różnych wyjątków. Należy pamiętać, że zostanie wykonany co najwyżej jeden moduł obsługi. Na przykład możemy dodać IndexError w powyższym kodzie. Ogólna składnia dodawania określonych wyjątków jest następująca:

try:  # statement(s) except IndexError:  # statement(s) except ValueError:  # statement(s)>

Przykład: Łapanie określonych wyjątków w Pythonie

Kod definiuje funkcję ' fun(a)'> to się kalkulujeb>na podstawie danych wejściowycha>. Jeślia>jest mniejsza niż 4, podejmuje próbę dzielenia przez zero, powodując a ' ZeroDivisionError'> . Kod wywołujefun(3)>Ifun(5)>wewnątrz bloku try-except. ObsługujeZeroDivisionError>Dofun(3)>i druki Wystąpił błąd ZeroDivisionError i został on obsłużony. The ' NameError'> blok nie jest wykonywany, ponieważ nie ma żadnych bloków ' NameError'> wyjątki w kodzie.

Python3




def> fun(a):> >if> a <>4>:> >b>=> a>/>(a>->3>)> >print>(>'Value of b = '>, b)> > try>:> >fun(>3>)> >fun(>5>)> except> ZeroDivisionError:> >print>(>'ZeroDivisionError Occurred and Handled'>)> except> NameError:> >print>(>'NameError Occurred and Handled'>)>

>

>

Wyjście

ZeroDivisionError Occurred and Handled>

Jeśli skomentujesz linię fun(3), wynikiem będzie

NameError Occurred and Handled>

Powyższe dane wyjściowe są takie, ponieważ gdy tylko Python spróbuje uzyskać dostęp do wartości b, pojawia się NameError.

Spróbuj z klauzulą ​​Else

W Pythonie możesz także użyć klauzuli else w bloku try-except, który musi występować po wszystkich klauzulach else. Kod wchodzi do bloku else tylko wtedy, gdy klauzula try nie zgłasza wyjątku.

Spróbuj z klauzulą ​​else

Kod definiuje funkcję AbyB(a, b)> to się kalkulujec>jako ((a+b) / (a-b)) i obsługuje potencjałZeroDivisionError>. Drukuje wynik, jeśli nie wystąpił błąd dzielenia przez zero. Powołanie AbyB(2.0, 3.0)> oblicza i drukuje-5.0>, podczas dzwonienia AbyB(3.0, 3.0)> próbuje dzielić przez zero, co daje a ZeroDivisionError> , który został złapany i a/b daje w wyniku 0 jest drukowany.

Python3

porównywalny interfejs w Javie




def> AbyB(a , b):> >try>:> >c>=> ((a>+>b)>/> (a>->b))> >except> ZeroDivisionError:> >print> (>'a/b result in 0'>)> >else>:> >print> (c)> AbyB(>2.0>,>3.0>)> AbyB(>3.0>,>3.0>)>

>

>

Wyjście:

-5.0 a/b result in 0>

Wreszcie słowo kluczowe w Pythonie

Python udostępnia słowo kluczowe Wreszcie , który jest zawsze wykonywany po blokach try i z wyjątkiem. Ostatni blok jest zawsze wykonywany po normalnym zakończeniu bloku try lub po zakończeniu bloku try z powodu jakiegoś wyjątku.

Składnia:

try:  # Some Code....   except:  # optional block  # Handling of exception (if required)  else:  # execute if no exception  finally:  # Some code .....(always executed)>

Przykład:

Kod próbuje wykonać dzielenie liczb całkowitych przez zero, co daje a ZeroDivisionError> . Łapie wyjątek i drukuje Nie można dzielić przez zero. Niezależnie od wyjątku,finally>blok jest wykonywany i drukowany To jest zawsze wykonywane.

Python3




try>:> >k>=> 5>/>/>0> >print>(k)> except> ZeroDivisionError:> >print>(>'Can't divide by zero'>)> finally>:> >print>(>'This is always executed'>)>

>

>

Wyjście:

Can't divide by zero This is always executed>

Podnoszenie wyjątku

The podnieś oświadczenie pozwala programiście wymusić wystąpienie określonego wyjątku. Jedyny argument w raise wskazuje wyjątek, który ma zostać zgłoszony. Musi to być instancja wyjątku lub klasa wyjątku (klasa wywodząca się z wyjątku).

Ten kod celowo podnosi aNameError>z wiadomością Cześć używającraise>oświadczenie w ciągu Atry>blok. Następnie łapieNameError>wyjątek, drukuje Wyjątek, i ponownie wywołuje ten sam wyjątek, używającraise>. To pokazuje, jak można zgłaszać i obsługiwać wyjątki w Pythonie, umożliwiając tworzenie niestandardowych komunikatów o błędach i dalszą propagację wyjątków.

Python3




try>:> >raise> NameError(>'Hi there'>)> except> NameError:> >print> (>'An exception'>)> >raise>

>

>

Dane wyjściowe powyższego kodu zostaną po prostu wydrukowane w wierszu jako wyjątek, ale w ostatnim wierszu wystąpi również błąd wykonania z powodu instrukcji raise w ostatnim wierszu. Zatem dane wyjściowe w wierszu poleceń będą wyglądać

Traceback (most recent call last):  File '/home/d6ec14ca595b97bff8d8034bbf212a9f.py', line 5, in   raise NameError('Hi there') # Raise Error NameError: Hi there>

Zalety obsługi wyjątków:

  • Poprawiona niezawodność programu : Prawidłowo obsługując wyjątki, możesz zapobiec awarii programu lub generowaniu nieprawidłowych wyników z powodu nieoczekiwanych błędów lub danych wejściowych.
  • Uproszczona obsługa błędów : Obsługa wyjątków umożliwia oddzielenie kodu obsługi błędów od głównej logiki programu, co ułatwia czytanie i konserwację kodu.
  • Kod czyszczący: Dzięki obsłudze wyjątków można uniknąć stosowania złożonych instrukcji warunkowych do sprawdzania błędów, co prowadzi do czystszego i bardziej czytelnego kodu.
  • Łatwiejsze debugowanie : Kiedy zostanie zgłoszony wyjątek, interpreter Pythona drukuje ślad, który pokazuje dokładną lokalizację, w której wystąpił wyjątek, co ułatwia debugowanie kodu.

Wady obsługi wyjątków:

  • Narzut wydajności: Obsługa wyjątków może być wolniejsza niż używanie instrukcji warunkowych do sprawdzania błędów, ponieważ interpreter musi wykonać dodatkową pracę, aby złapać i obsłużyć wyjątek.
  • Zwiększona złożoność kodu : Obsługa wyjątków może sprawić, że Twój kod stanie się bardziej złożony, szczególnie jeśli musisz obsługiwać wiele typów wyjątków lub wdrożyć złożoną logikę obsługi błędów.
  • Możliwe zagrożenia bezpieczeństwa: Nieprawidłowo obsługiwane wyjątki mogą potencjalnie ujawnić poufne informacje lub stworzyć luki w zabezpieczeniach kodu, dlatego ważne jest, aby ostrożnie obchodzić się z wyjątkami i unikać ujawniania zbyt wielu informacji o programie.

Ogólnie rzecz biorąc, zalety obsługi wyjątków w Pythonie przeważają nad wadami, ale ważne jest, aby korzystać z niej rozsądnie i ostrożnie, aby zachować jakość kodu i niezawodność programu.

Autorem tego artykułu jest Nikhil Kumar Singh (nickzuck_007)