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
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 blokutry.
Przechwytywanie komunikatu o wyjątku
Użyj as, aby powiązać obiekt wyjątku z nazwą:
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
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneKrotka typów przechwytuje dowolny wyjątek tych typów (lub ich klas pochodnych).
Pełna struktura: try / except / else / finally
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 exceptionelse— używaj go do kodu, który zależy od powodzenia blokutry. 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:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bNajczę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 bloktryzakoń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
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`.
Pokaż wskazówkę
int('abc') zgłasza ValueError.
Rozwiązanie dostępne po 3 próbach
Ćwiczenie powtórzeniowe
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.
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
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`.
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