Cykl: Dekoratory w Pythonie – jak i kiedy używać · Część 4/10

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

Kacper Sieradziński
Kacper Sieradziński17 marca 2025 · 3 min czytania
Streszczenie
  • Czym jest wyjątek w Pythonie?
  • Obsługa wyjątków – blok i
  • Bloki i
  • Hierarchia wyjątków w Pythonie
Obsługa błędów i wyjątki w Pythonie – pisz bezpieczny kod

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.

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

Kurs · 24 lekcje8h 14m
Kurs

Kurs Python dla początkujących — PyStart

Zacznij programować w Pythonie! Idealne dla osób bez doświadczenia. Praktyczne zadania, projekty i wsparcie społeczności.

  • 24 lekcje wideo + 80 ćwiczeń
  • Realne bazy z e-commerce
  • Społeczność i code-review
499 zł799 zł−38%
Rozpocznij naukę

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

Newsletter · co środę

Python co tydzień — newsletter dla programistów

Otrzymuj codzienne ćwiczenia, ciekawostki z ekosystemu Pythona i wskazówki do rozmów rekrutacyjnych.

2 312 czytelników · ⭐ 4,8
  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.
Część 5 z 10

Wprowadzenie do programowania funkcyjnego w Pythonie

druga lekcja cyklu „Dekoratory w Pythonie – jak i kiedy używać"

Czytaj kolejny →