Obsługa błędów i wyjątki w Pythonie – pisz bezpieczny kod

Kacper Sieradziński
Kacper Sieradziński
17 marca 2025Edukacja3 min czytania

Każdy program prędzej czy później się wykrzaczy – pytanie brzmi czy zrobisz to z klasą, czy z hukiem. Obsługa błędów i wyjątków to klucz do pisania stabilnego, odpornego na awarie kodu, który nie zatrzymuje działania całej aplikacji przy pierwszym potknięciu.

Obraz główny Obsługa błędów i wyjątki w Pythonie – pisz bezpieczny kod

W tym artykule nauczysz się:

  • czym różni się błąd od wyjątku,
  • jak używać try, except, elsefinally,
  • jak tworzyć własne wyjątki,
  • i jak pisać kod, który potrafi sam się „obronić" w sytuacjach awaryjnych.

Czym jest wyjątek w Pythonie?

Wyjątek (Exception) to zdarzenie, które przerywa normalny przepływ programu, gdy coś pójdzie nie tak. Python natychmiast przerywa wykonywanie kodu i zgłasza wyjątek – np. gdy próbujesz dzielić przez zero lub odwołać się do nieistniejącego pliku.

Przykład:

Python
1 2 x = 10 / 0 print("To się nigdy nie wykona")

Wynik:

Bash
1 ZeroDivisionError: division by zero

Kod przestaje działać w miejscu błędu. Jeśli go nie obsłużysz, aplikacja się zakończy.

Obsługa wyjątków – blok try i except

Podstawowy sposób obsługi błędów to użycie konstrukcji:

Python
1 2 3 4 try: # kod, który może spowodować błąd except: # reakcja na błąd

Przykład:

Python
1 2 3 4 5 try: number = int(input("Podaj liczbę: ")) print(10 / number) except: print("Coś poszło nie tak")

Działa – ale jest zbyt ogólne. Nie wiesz, co dokładnie poszło nie tak. Lepiej obsługiwać konkretne wyjątki:

Python
1 2 3 4 5 6 7 try: number = int(input("Podaj liczbę: ")) print(10 / number) except ValueError: print("To nie jest liczba!") except ZeroDivisionError: print("Nie dziel przez zero!")

Bloki else i finally

Python daje Ci dwa dodatkowe narzędzia, które zwiększają kontrolę nad przepływem programu.

else

Blok else wykona się tylko wtedy, gdy w try nie wystąpi żaden wyjątek:

Python
1 2 3 4 5 6 try: result = 10 / 2 except ZeroDivisionError: print("Błąd dzielenia!") else: print("Wszystko działa poprawnie:", result)

finally

Blok finally wykona się zawsze – niezależnie od tego, czy wystąpił błąd, czy nie. Przydaje się do sprzątania po programie (zamykanie plików, połączeń z bazą itp.):

Python
1 2 3 4 5 6 7 8 try: file = open("data.txt") content = file.read() except FileNotFoundError: print("Nie znaleziono pliku") finally: file.close() print("Plik został zamknięty")

Hierarchia wyjątków w Pythonie

Każdy wyjątek w Pythonie jest klasą, która dziedziczy po BaseException lub Exception. Najczęściej spotykane wyjątki to:

  • ValueError – niepoprawna wartość,
  • TypeError – niezgodny typ danych,
  • IndexError – odwołanie poza zakres listy,
  • KeyError – brak klucza w słowniku,
  • FileNotFoundError – brak pliku,
  • ZeroDivisionError – dzielenie przez zero.

Dzięki temu możesz przechwytywać konkretne klasy wyjątków, a nawet tworzyć własne.

Tworzenie własnych wyjątków

Jeśli tworzysz bibliotekę, API lub aplikację z własną logiką biznesową, warto definiować własne klasy wyjątków, aby kod był bardziej czytelny.

Python
1 2 3 4 5 6 7 8 9 10 11 12 class InvalidAgeError(Exception): pass def set_age(age): if age < 0: raise InvalidAgeError("Wiek nie może być ujemny") print("Wiek ustawiony:", age) try: set_age(-5) except InvalidAgeError as e: print("Błąd:", e)

Tworzenie własnych wyjątków to sposób na czytelne komunikowanie błędów domenowych – takich, które wynikają z logiki aplikacji, a nie błędów technicznych.

Obsługa wielu wyjątków w jednym bloku

Możesz obsłużyć kilka typów błędów w jednym except:

Python
1 2 3 4 try: result = 10 / int("x") except (ValueError, ZeroDivisionError) as e: print("Wystąpił błąd:", e)

Rzucanie wyjątków – raise

Nie tylko Python może generować wyjątki – Ty też możesz świadomie je rzucać:

Python
1 2 3 4 5 6 7 8 9 def divide(a, b): if b == 0: raise ZeroDivisionError("Dzielenie przez zero jest niedozwolone") return a / b try: print(divide(10, 0)) except ZeroDivisionError as e: print("Błąd:", e)

raise to potężne narzędzie, gdy chcesz wymusić kontrolowany błąd, zamiast pozwalać programowi działać w nieprawidłowym stanie.

Najczęstsze błędy przy obsłudze wyjątków

1. Używanie except: bez typu

To łapie wszystko, włącznie z błędami systemowymi. Używaj tego tylko przy debugowaniu lub logowaniu, nigdy w kodzie produkcyjnym.

2. Ignorowanie błędów

except: pass to najgorsze, co możesz zrobić – program działa „pozornie", ale ukrywasz przyczynę błędu.

3. Zbyt rozległe try-except

Nie otaczaj całego kodu jednym try. Lepiej lokalizować ryzykowne fragmenty, by wiedzieć, gdzie naprawdę wystąpił problem.

Dobre praktyki obsługi błędów

  1. Przechwytuj tylko te błędy, które rozumiesz. Jeśli nie wiesz, jak go poprawić – nie łap go.

  2. Loguj wyjątki. Używaj modułu logging, aby zapisywać błędy zamiast je wyświetlać użytkownikowi.

  3. Nie ukrywaj błędów – kontroluj je. Lepiej, by program zakończył się z komunikatem, niż działał niepoprawnie.

  4. Twórz własne wyjątki dla logiki biznesowej. Zwiększa to czytelność i utrzymanie kodu.

Podsumowanie

Obsługa wyjątków w Pythonie to nie kosmetyka – to fundament niezawodnego oprogramowania. Pozwala Ci reagować na nieprzewidziane sytuacje, zapobiegać awariom i utrzymywać kod w stanie przewidywalnym.

Zapamiętaj:

  • try/except to narzędzie kontroli przepływu, nie „łatka na błędy",
  • im bardziej precyzyjnie łapiesz wyjątki, tym bezpieczniejszy kod piszesz,
  • dobrze zaprojektowany system błędów sprawia, że Twój kod nie tylko działa — on rozumie, co robi.