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ówValueError
lubZeroDivisionError
.
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 blokutry
.
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 iZeroDivisionError
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
lubTypeError
, 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 blokutry
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.