Wypróbuj Pythona z wyjątkiem: wyjaśniono w przykładach

Python Try z wyjątkiem jest konstrukcją używaną w Pythonie do płynnej obsługi wyjątków bez awarii.

Obsługa wyjątków sprawia, że ​​kod programu jest bardziej niezawodny i mniej podatny na awarie. W tym artykule omówiono obsługę wyjątków i typowe scenariusze, w których obsługa wyjątków jest idealna. Jako bonus omówimy również, jak zgłaszać wyjątki.

Co to jest obsługa wyjątków?

Wyjątkami są krytyczne anomalie i błędy, które powstają podczas wykonywania programu. Jeśli nie zostaną obsłużone, wyjątki spowodują awarię programu. Dlatego obsługa wyjątków jest sposobem obsługi wyjątków zapewniającym, że nie spowodują one awarii programu.

Oto przykład ilustrujący, czym jest wyjątek.

user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)

Na pierwszy rzut oka wydaje się, że z powyższym programem nie ma nic złego. Otrzymuje dane wejściowe od użytkownika i konwertuje je na liczbę całkowitą. Następnie wyświetla podwojoną liczbę całkowitą podaną przez użytkownika.

Program działa poprawnie, jeśli zostanie uruchomiony z wartością wejściową 5. Zobacz poniżej.

Załóżmy jednak, że ponownie uruchomiłeś ten sam program. Tylko tym razem zamiast używać 5 jako danych wejściowych, wpisujesz ciąg „cześć”. Program ulegnie awarii. Ciągu „witaj” nie można przekonwertować na liczbę całkowitą, dlatego zgłaszany jest wyjątek i program ulega awarii.

Dlaczego zgłaszane są wyjątki i dlaczego należy się nimi zająć?

Zgłaszane są wyjątki, ponieważ podczas kodowania często rozkładamy programy na funkcje. Funkcje te są następnie wywoływane w celu wykonania różnych zadań.

W powyższym przykładzie wywołaliśmy funkcję wejściową, aby otrzymać dane wejściowe użytkownika, następnie wywołaliśmy funkcję int, aby przekonwertować wejściowy ciąg znaków na liczbę całkowitą, a na koniec wywołaliśmy funkcję print, aby wyświetlić dane wyjściowe.

Jednakże podczas wykonywania swoich działań funkcje mogą napotkać błędy, z którymi nie będą wiedzieć, jak sobie poradzić. W takim przypadku wspomniane funkcje muszą przestać działać i zasygnalizować, że napotkano błąd. Aby się porozumieć, zgłoszą wyjątki.

Za wysłuchiwanie tych wyjątków i odpowiednią reakcję odpowiada kod zwany funkcją. Jeśli nie zostanie to zrobione, program ulegnie awarii po napotkaniu błędów, jak widzieliśmy we wcześniejszym przykładzie.

Dlatego wyjątki są zasadniczo mechanizmem komunikacyjnym, który umożliwia wywołanej funkcji wysłanie sygnału alarmowego do kodu, który go wywołał. A właściwie wspomniane wcześniej reagowanie jest istotą obsługi wyjątków.

Różne rodzaje wyjątków

Ważne jest, aby wiedzieć, że nie wszystkie wyjątki są takie same. Istnieją różne rodzaje wyjątków zgłaszanych w przypadku różnych napotkanych błędów. Na przykład, jeśli spróbujesz podzielić liczbę przez zero, zostanie zgłoszony błąd ZeroDivisionError. Podczas próby wykonania operacji z nieprawidłowym typem danych pojawia się komunikat TypeError. Oto pełna lista rodzaje wyjątków.

Jak obsługiwać wyjątki

Jak wyjaśniono wcześniej, wyjątkami są sygnały o niebezpieczeństwie wysyłane przez funkcje, które wywołujemy. Dlatego nasz kod powinien słuchać tych sygnałów alarmowych i odpowiednio reagować, gdy się pojawią. Aby odpowiednio obsługiwać wyjątki, używamy konstrukcji Python Try z wyjątkiem. Podstawowa struktura konstrukcji jest następująca:

try:
    # Code to try and run
except:
    # Code to run if an exception is raised
finally:
    # Code to run in the end, whether or not an exception is raised

Jak widać, konstrukcja składa się z trzech słów kluczowych wyjaśnionych poniżej:

próbować

Słowo kluczowe try oznacza początek konstrukcji Python Try z wyjątkiem. Ponadto oznacza blok kodu, który może potencjalnie zgłosić wyjątek. Jest to instrukcja dla interpretera Pythona, aby spróbował uruchomić kod w bloku. Jeśli zostanie zgłoszony wyjątek, program natychmiast się zatrzymuje i wykonuje skok, aby wykonać kod zapisany w bloku z wyjątkiem.

z wyjątkiem

Słowo kluczowe z wyjątkiem oznacza blok kodu, który zostanie wykonany, jeśli podczas wykonywania bloku try zostanie zgłoszony wyjątek. Można zdefiniować wiele bloków z wyjątkiem dla różnych typów wyjątków, które mogą zostać zgłoszone. Zostanie to zilustrowane później.

Wreszcie

Słowo kluczowe last jest trzecim i ostatnim słowem kluczowym używanym w Pythonie Try z wyjątkiem. Oznacza blok kodu, który zostanie wykonany niezależnie od tego, czy zostanie zgłoszony wyjątek.

Przykład

Oto przykład, jak powyższe słowa kluczowe mogą obsłużyć wyjątek. Zmodyfikujemy w tym celu poprzedni przykład.

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except:
    print("Something went wrong")
finally:
    print("This code will be executed no matter what")

Jeśli uruchomisz powyższy kod z wartością 5, prawidłowym wejściem, otrzymasz następujące informacje:

A jeśli uruchomisz go ze słowem „cześć”, otrzymasz następujące informacje:

Jeśli więc podczas wykonywania kodu w bloku try nie został zgłoszony żaden wyjątek, komputer przeszedł do bloku Final. Jednakże, gdy podczas wykonywania kodu w bloku try został zgłoszony wyjątek, komputer przeniósł się do bloku z wyjątkiem, a następnie do bloku last.

Można także obsługiwać wyjątki dla określonych rodzajów błędów. Na przykład, jeśli chcesz obsługiwać wyjątki ValueError i KeyboardInterrupt w określony sposób, możesz zmodyfikować powyższy kod w następujący sposób:

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except ValueError:
    print("Value can't be converted to int")
except KeyboardInterrupt:
    print("Received a keyboard interrupt")
except:
    print("Catch-all exception block")
finally:
    print("This code will be executed no matter what")

W powyższym kodzie mamy 3 oprócz bloków. Pierwszy blok z wyjątkiem przechwytuje tylko wyjątki ValueError, podczas gdy drugi wychwytuje tylko wyjątki KeyboardInterrupt. Z ostatnim blokiem wyjątkiem nie jest powiązany typ wyjątku, na który należy nasłuchiwać. W rezultacie przechwytuje resztę wyjątków, których nie przechwyciły pierwsze dwa bloki.

Uruchamiając powyższy kod, powinieneś otrzymać wynik podobny do tego:

Po zgłoszeniu wyjątku można uzyskać więcej informacji o wyjątku w obiekcie wyjątku. Aby uzyskać dostęp do obiektu wyjątku, użyj słowa kluczowego as. Używa się go w następujący sposób:

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except ValueError as e:
    print("Value Error:", e)
except KeyboardInterrupt as e:
    print("Keyboard Interrupt:", e)
except Exception as e:
    print("Some other exception", e)

Jak zgłaszać wyjątki

Do tej pory mieliśmy do czynienia z wyjątkami wywoływanymi przez inne funkcje. Możliwe jest jednak również zgłoszenie wyjątków w kodzie. Aby zgłosić wyjątek, używamy słowa kluczowego raise. Określamy również klasę reprezentującą typ wyjątku, który chcemy zgłosić, oraz komunikat czytelny dla człowieka powiązany z wyjątkiem.

W poniższym przykładzie używamy klasy wyjątku, aby zgłosić wyjątek ogólny. Następnie przekazujemy wiadomość konstruktorowi klasy.

raise Exception('Something went wrong')

Jeśli uruchomisz powyższy fragment jako program, otrzymasz wynik podobny do tego:

Można także określić różne rodzaje wyjątków. Na przykład możesz zgłosić wyjątek TypeError, gdy wartość ma niewłaściwy typ danych:

def double(x):
    if isinstance(x, int):
        return x * 2
    else
        raise TypeError('x should be an int')

Lub jeśli określona wartość wykracza poza akceptowalne granice, możesz zgłosić błąd ValueError:

def say_hello(name):
    if name == '':
        raise ValueError('Value outside bounds')
    else:
        print('Hello', name)

Możesz także utworzyć typy wyjątków, podklasując klasę wyjątków. Oto przykład:

class InvalidHTTPMethod(Exception):
    pass

W powyższym przykładzie utworzyliśmy klasę InvalidHTTPMethod, która dziedziczy po klasie Wyjątek. Możemy go użyć w taki sam sposób jak poprzednio, aby zgłosić wyjątki:

raise InvalidHTTPMethod('Must be GET or POST')

Typowe przypadki użycia obsługi wyjątków

Obsługa wyjątków jest używana w wielu scenariuszach. Poprzedni przykład pokazał, jak może obsługiwać wyjątki wynikające z danych wprowadzonych przez użytkownika. W tej sekcji omówione zostaną dwie dodatkowe sytuacje, w których przydatna jest obsługa wyjątków. Są to obsługa wyjątków w wyniku nieudanych żądań sieciowych i obsługa wyjątków podczas odczytu plików.

Wysyłanie żądań sieciowych

W poniższym przykładzie kierujemy żądanie do Google. Nasłuchujemy wyjątków, aby je obsłużyć. Te wyjątki są zdefiniowane w obiekcie request.exceptions.

import requests

try:
    response = requests.get("https://google.com")

    # Check if the response status code is in the 200-299 range (successful response)
    if 200 <= response.status_code < 300:
        print("Request was successful!")
    else:
        print(f"Request failed with status code: {response.status_code}")
except requests.exceptions.RequestException as e:
    print(f"RequestException occurred: {e}")
except requests.exceptions.ConnectionError as e:
    print(f"ConnectionError occurred: {e}")
except requests.exceptions.Timeout as e:
    print(f"Timeout occurred: {e}")
except requests.exceptions.TooManyRedirects as e:
    print(f"TooManyRedirects occurred: {e}")
except requests.exceptions.HTTPError as e:
    print(f"HTTPError occurred: {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

Odczyt danych z pliku

W tym ostatnim przykładzie czytamy dane z pliku hello.txt. Obsługujemy również typowe wyjątki, które mogą zostać zgłoszone, takie jak błąd FileNotFound i IOError.

try:
    with open(file_path, 'r') as file:
        data = file.read()
        print("File contents:")
        print(data)
except FileNotFoundError as e:
    print(f"FileNotFoundError occurred: {e}")
except IOError as e:
    print(f"IOError occurred: {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

Wniosek

W tym artykule omówiono, jakie są wyjątki i dlaczego zostały zgłoszone. Ustaliliśmy również, że zajmujemy się nimi, aby kod był bardziej niezawodny i zapobiegał awariom. Na koniec omówiliśmy, jak obsługiwać wyjątki, a także jak zgłaszać niektóre wyjątki.

Następnie sprawdź typowe typy błędów Pythona i sposoby ich rozwiązywania.