Przejdź do głównej treści
eLearner.app
Moduł 2 · Lekcja 4 z 48/36 w kursie~12 min
Lekcje modułu (4/4)

Obsługa błędów: try/except

Gdy coś pójdzie nie tak w czasie wykonywania (dzielenie przez zero, brakujący klucz, operacja na niezgodnych typach), Python zgłasza wyjątek (exception). Bez obsłużenia wyjątek przerywa działanie programu. Dzięki try / except możesz przechwycić go i zdecydować, co zrobić.

Podstawowa forma

Python
try:
    risultato = 10 / 0
except ZeroDivisionError:
    risultato = None
risultato  # None
  • blok try: zawiera kod, który może się nie powieść;
  • blok except <ErrorType>: jest wykonywany tylko wtedy, gdy ten typ błędu zostanie zgłoszony wewnątrz bloku try.

Przechwytywanie komunikatu o wyjątku

Użyj as, aby powiązać obiekt wyjątku z nazwą:

Python
try:
    int("non è un numero")
except ValueError as e:
    messaggio = str(e)
messaggio  # "invalid literal for int() with base 10: 'non è un numero'"

Wiele typów razem

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Krotka typów przechwytuje dowolny wyjątek tych typów (lub ich klas pochodnych).

Pełna struktura: try / except / else / finally

Python
try:
    n = int("42")
except ValueError:
    print("not a number")
else:
    print(f"parsed: {n}")     # executed only if NO exception occurred
finally:
    print("always executed")  # executed regardless, even on exception
  • else — używaj go do kodu, który zależy od powodzenia bloku try. Trzymaj go osobno, aby przypadkowo no nie przechwycić niepowiązanych wyjątków.
  • finally — sprzątanie, które musi odbyć się zawsze (zamknięcie pliku, zwolnienie zasobu). Wykonywane zarówno przy powodzeniu, jak i przy błędzie.

Zgłaszanie wyjątku: raise

Czasami to Ty chcesz zasygnalizować, że coś poszło nie tak:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

Najczęstsze wbudowane wyjątki, które napotkasz i będziesz zgłaszać:

  • ValueError — wartość ma odpowiedni typ, ale jest nieakceptowalna (np. parsowanie).
  • TypeError — typ jest nieprawidłowy (np. len(42)).
  • KeyError / IndexError — brakujący klucz/indeks.
  • ZeroDivisionError — dzielenie przez zero.
  • FileNotFoundError, PermissionError — operacje na systemie plików.

Klauzule else i finally w blokach try

Blok try może definiować dwie dodatkowe klauzule:

  • else: wykonywana tylko wtedy, gdy blok try zakończy się bez zgłoszenia żadnych wyjątków.
  • finally: wykonywana zawsze, niezależnie od tego, czy wystąpił wyjątek. Jest to idealne rozwiązanie do czyszczenia zasobów (np. zamykania otwartego pliku lub połączenia z bazą danych).

Spróbuj sam

Ćwiczenie#python.m2.l4.e1
Próby: 0Ładowanie...

Napisz wyrażenie, które próbuje wykonać int('abc'): jeśli zostanie zgłoszony ValueError, przypisz ciąg znaków 'errore' do zmiennej `result`; w przeciwnym razie przypisz liczbę. Oceń `result`.

Ładowanie edytora...
Pokaż wskazówkę

int('abc') zgłasza ValueError.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie powtórzeniowe

Ćwiczenie#python.m2.l4.e2
Próby: 0Ładowanie...

Zdefiniuj funkcję `divide(a, b)`, która zwraca a/b, ale zgłasza ValueError z komunikatem 'divisore zero', jeśli b wynosi 0. Następnie wywołaj divide(10, 0) wewnątrz try/except i przypisz do `message` ciąg znaków przechwyconego wyjątku.

Ładowanie edytora...
Pokaż wskazówkę

Zgłoś raise ValueError('...') wewnątrz funkcji; przechwyć za pomocą except ValueError as e.

Rozwiązanie dostępne po 3 próbach

Dodatkowe wyzwanie

Ćwiczenie#python.m2.l4.e3
Próby: 0Ładowanie...

Napisz blok `try-except`, aby przekonwertować ciąg znaków `text_val = "abc"` na liczbę całkowitą. Jeśli konwersja zgłosi `ValueError`, przypisz `None` do `result`. W przeciwnym razie przypisz przekonwertowaną liczbę. Na koniec oceń `result`.

Ładowanie edytora...
Pokaż wskazówkę

Użyj try: result = int(text_val) a następnie except ValueError: result = None.

Rozwiązanie dostępne po 3 próbach