Obsługa błędów w Pythonie

Obsługa błędów w Pythonie

W tym artykule wyjaśnimy obsługę błędów w Pythonie.

YouTube Video

Obsługa błędów w Pythonie

Obsługa błędów w Pythonie jest głównie realizowana za pomocą słów kluczowych try, except, else i finally. Użycie tych konstrukcji pozwala odpowiednio reagować, gdy w Twoim programie wystąpi błąd. Poniżej wyjaśnimy, jak korzystać z każdego z nich.

Blok try

W bloku try umieszczasz kod, który chcesz wykonać. Jeśli w tym bloku wystąpi błąd, wykonanie programu natychmiast przechodzi do bloku except.

 1try:
 2    # Code that may raise an error (division by zero, for example)
 3    #number = int(input("Enter a number: "))
 4    number = int("abc")
 5    result = 10 / number
 6    print("Result:", result)
 7except ValueError as e:
 8    # Handle invalid input (e.g. non-numeric input)
 9    print("Invalid input. Please enter a whole number.")
10    print(f"Value error: {e}")
11except ZeroDivisionError as e:
12    # Handle division by zero error
13    print("Cannot divide by zero!")
14    print(f"Zero division error: {e}")
  • Ten kod jest przykładem wykrywania błędów w bloku try i odpowiedniego ich obsługiwania poprzez przechwytywanie wyjątków ValueError lub ZeroDivisionError.

Blok except

W bloku except umieszczasz kod, który zostanie wykonany, gdy wystąpi określony wyjątek (błąd). Możesz również przechwytywać określone wyjątki w zależności od rodzaju występującego wyjątku.

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = 0
 4    result = 10 / number
 5    print("Result:", result)
 6except ZeroDivisionError as e:
 7    print("Cannot divide by zero!")
 8    print(f"Zero division error: {e}")
 9except ValueError as e:
10    print("Input was not a valid integer.")
11    print(f"Value error: {e}")
  • Ten kod jest przykładem wykonania innej obsługi dla każdego typu wyjątku w bloku except, gdy wystąpi błąd w bloku try.

Obsługa wielu wyjątków jednocześnie

Użyj krotki, gdy wiele klas wyjątków może mieć wspólną logikę obsługi.

1try:
2    my_list = [1, 2]
3    result = my_list[3] + 10 / 0
4except (IndexError, ZeroDivisionError) as e:
5    print(f"Exception occurred: {e}")
  • Ten kod jest przykładem przechwytywania zarówno IndexError, jak i ZeroDivisionError razem oraz obsługi tych wyjątków w ten sam sposób.

Bezwarunkowe przechwytywanie wyjątków

Pomiń argument dla except, jeśli chcesz obsłużyć wszystkie typy wyjątków w jednym bloku.

1try:
2    # This code might cause some exception
3    result = "10" + 5  # TypeError
4except Exception as e:
5    print("Unexpected error")
  • Jednak obsługa konkretnych wyjątków zamiast bezwarunkowego przechwytywania wszystkich wyjątków jest bardziej pomocna w wykrywaniu błędów i debugowaniu. Kiedy to możliwe, jawna obsługa tylko przewidywanych wyjątków, takich jak ValueError lub TypeError, zwiększy odporność Twojego kodu.

Blok else

Blok else jest wykonywany tylko wtedy, gdy w bloku try nie wystąpią żadne błędy.

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = 5
 4    result = 10 / number
 5except ZeroDivisionError as e:
 6    print("Cannot divide by zero!")
 7    print(f"Zero division error: {e}")
 8except ValueError as e:
 9    print("Input was not a valid integer.")
10    print(f"Value error: {e}")
11else:
12    # This block will execute only if no exceptions were raised
13    print("Result:", result)
  • Ten kod jest przykładem, w którym blok else jest wykonywany tylko wtedy, gdy w bloku try nie wystąpi żaden błąd.

Blok finally

Blok finally służy do umieszczenia kodu, który zawsze będzie wykonany na końcu, niezależnie od tego, czy w bloku try wystąpił błąd. Jest to przydatne do zwalniania zasobów lub wykonywania zadań porządkowych.

 1try:
 2    #number = int(input("Enter a number: "))
 3    number = int("abc")
 4    result = 10 / number
 5except ZeroDivisionError as e:
 6    print("Cannot divide by zero!")
 7    print(f"Zero division error: {e}")
 8except ValueError as e:
 9    print("Input was not a valid integer.")
10    print(f"Value error: {e}")
11else:
12    # This block will execute only if no exceptions were raised
13    print("Result:", result)
14finally:
15    # This block will always execute, regardless of whether an exception was raised
16    print("Execution completed.")
  • Ten kod jest przykładem pokazującym, że blok finally jest wykonywany niezależnie od tego, czy wystąpi wyjątek, czy nie.

Słowo kluczowe raise

Można również zgłosić wyjątek za pomocą słowa kluczowego raise, gdy nie są spełnione określone warunki w istniejącym kodzie.

1def divide(a, b):
2    if b == 0:
3        raise ValueError("Cannot divide by zero.")
4    return a / b
5
6try:
7    result = divide(10, 0)
8except ValueError as e:
9    print(f"Error: {e}")
  • Ten kod jest przykładem jawnego zgłaszania wyjątku za pomocą słowa kluczowego raise, gdy warunek nie zostanie spełniony.

Wnioski

Dzięki takiej obsłudze błędów możesz zapobiec awariom programu, wyświetlić odpowiednie komunikaty użytkownikowi oraz kontynuować dalsze przetwarzanie programu.

Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.

YouTube Video