Błędy i try / except – program, którego nie da się wywalić
Materiały tej lekcji są na razie tylko do czytania na stronie. Kod przepisz albo skopiuj do swojego edytora.
Czego się nauczysz
Wpisujesz literę zamiast liczby i program przerywa działanie czerwonym komunikatem. Nie ma wyniku, nie ma menu, nie ma niczego dalej. Na tej lekcji nauczysz się pisać program, którego nie da się w ten sposób wywalić.
Po tej lekcji:
- zabezpieczysz konwersję blokiem
tryorazexcept ValueError, - wyjaśnisz, dlaczego gołe
except:jest złym pomysłem, - wymienisz cztery nazwy błędów i podasz przyczynę każdego,
- twój program po błędnych danych będzie działał dalej.
Bez zabezpieczenia program po prostu ginie
wiek = int(input("Wiek: "))
# wpisano: abc
# ValueError: invalid literal for int() with base 10: 'abc'
Nazwa błędu jest podpowiedzią. ValueError znaczy: dostałem tekst, ale jego wartości nie da się przerobić na liczbę. To najczęstszy błąd, jaki będziesz łapać.
Na egzaminie program, który przerywa działanie, kosztuje punkty w części „implementacja, kompilacja i uruchomienie programów”, a nie tylko w samym zadaniu.
try i except – łapanie błędu
try:
wiek = int(input("Wiek: "))
print(f"Za rok {wiek + 1}")
except ValueError:
print("To nie jest liczba!")
Czytaj to jak zdanie: spróbuj wykonać blok try. Jeśli poleci błąd o nazwie ValueError, nie przerywaj programu – wykonaj zamiast tego blok except.
- W bloku
tryumieszczasz kod, który może się wywalić: konwersję i wszystko, co od niej zależy. - W bloku
exceptumieszczasz reakcję: komunikat dla użytkownika. - Po obu słowach stoi dwukropek, a zawartość jest wcięta.
Jeśli w bloku try wszystko pójdzie dobrze, blok except w ogóle się nie wykona.
Nigdy gołe except:
Nie pisz samego except: bez nazwy błędu. Takie except łapie wszystko, w tym twoje własne literówki. Zamiast właściwego komunikatu zobaczysz „To nie jest liczba”, choć problem był zupełnie gdzie indziej – i będziesz go długo szukać.
Zawsze podawaj nazwę błędu po słowie except.
Cztery błędy, które realnie spotkasz
- ValueError –
int("abc"). Użytkownik wpisał tekst zamiast liczby. - ZeroDivisionError –
x / 0. Typowo: średnia z pustej listy. - IndexError –
lista[10]. Pętla po indeksach poszła o jeden za daleko. - TypeError –
"tekst" + 5. Sklejanie napisu z liczbą bez f-stringa.
Pierwszy pokrywa większość sytuacji. Drugi łapiesz przy każdej średniej. Trzeci i czwarty to raczej własne pomyłki niż wina użytkownika – te lepiej naprawić w kodzie, niż przechwytywać.
Można podać kilka nazw naraz: except (ValueError, ZeroDivisionError):
Dodatek: else i finally
W kodzie z lekcji na końcu jest ciekawostka: blok else wykonuje się tylko wtedy, gdy błędu nie było, a finally wykonuje się zawsze. Nie są wymagane na egzaminie, ale warto je kojarzyć.
Spróbuj sam
Kod z tej lekcji nie czeka na klawiaturę – złe dane są w nim symulowane, żebyś od razu widział wynik.
- Znajdź linię
tekst = "abc"i zmień ją natekst = "15". Uruchom program i zobacz, który blok się wykonał. - Obejrzyj w wyniku „katalog typowych błędów” – każda linia pokazuje nazwę błędu i jego komunikat.
- Porównaj funkcje
zleidobrze: pierwsza ma gołeexcept:, drugaexcept ValueError:.
Zadania z lekcji:
- Program prosi o liczbę całkowitą i wypisuje jej kwadrat. Po wpisaniu tekstu wypisuje „To nie jest liczba całkowita!” i kończy się normalnie, bez czerwonego błędu.
- Program prosi o dwie liczby i wypisuje wynik dzielenia. Zabezpiecz go zarówno przed tekstem, jak i przed dzieleniem przez zero – dwie różne nazwy błędów.
- Weź swój program liczący pole prostokąta z poprzedniej lekcji i zabezpiecz go blokiem
tryorazexcept. - Napisz program z gołym
except:i sprawdź, co się stanie, gdy w blokutryzrobisz literówkę w nazwie zmiennej. Opisz wynik w komentarzu.
Sprawdź się
- Zabezpieczę konwersję blokiem
tryorazexcept ValueError. - Wyjaśnię, dlaczego gołe
except:jest złym pomysłem. - Wymienię cztery nazwy błędów i podam przyczynę każdego.
- Mój program po błędnych danych działa dalej, zamiast się przerywać.
Na następnej lekcji: ostatnia lekcja tego bloku. Połączysz pętlę, warunek i przechwytywanie błędów w jeden wzorzec – program, który nie puści dalej, dopóki nie dostanie poprawnej wartości.
Notatki
Prezentacja
Kod
Otwórz kod, zmieniaj go i uruchamiaj na stronie – np. usuń # z linii oznaczonej jako błąd i zobacz, co się stanie. „Przywróć” wraca do wersji z lekcji.