Python • kurs podstawowy • lekcja 30
Obsługa wyjątków
Użytkownik może wpisać słowo zamiast liczby.
Twój cel: Obsłużysz niepoprawne wejście i ponowisz pytanie bez ukrywania innych błędów.Diagnozowanie błędów, input(), pętle i funkcje.
Od potrzeby do kodu
To przewidywalny problem wejścia. try wyznacza kod, który może zgłosić wyjątek. except ValueError reaguje tylko na ten typ. Po błędzie pozostałe instrukcje try są pomijane. Gdy nie ma wyjątku, wykonuje się opcjonalny blok else.
Poprawna konwersja nie oznacza jeszcze poprawnych danych: int("-2") działa, ale ujemny wiek nie pasuje do reguły. Oddziel sprawdzenie formatu od sprawdzenia zakresu. W pętli continue pozwoli wrócić do pytania, a break zakończyć je po poprawnych danych.
Nie używaj ogólnego except, aby ukryć każdy problem. Literówka nazwy nie powinna wyglądać jak pomyłka użytkownika. Własna funkcja może zgłosić ValueError przez raise, gdy argument łamie jej regułę; wywołujący może wtedy zdecydować, jak zareagować. Obsługa błędu ma podpowiadać następny krok.
Przewidź przed uruchomieniem
W tym przebiegu wpisz kolejno: kot, -2, 12.
while True:
try:
age = int(input("Wiek: "))
except ValueError:
print("Wpisz liczbę całkowitą")
continue
if age < 0:
print("Wiek nie może być ujemny")
continue
print(f"Przyjęto: {age}")
break
Porównaj wynik i prześledź mechanizm
kot uruchamia except ValueError i ponowienie. -2 przechodzi konwersję, ale trafia do if age < 0. 12 zostaje przyjęte; program wypisuje Przyjęto: 12 i kończy pętlę przez break.
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
Wiek: Wpisz liczbę całkowitą
Wiek: Wiek nie może być ujemny
Wiek: Przyjęto: 12
| Wejście | Konwersja | Reguła zakresu | Decyzja |
|---|---|---|---|
| kot | ValueError | nie sprawdzamy | Pytaj ponownie |
| -2 | int = -2 | naruszona | Pytaj ponownie |
| 12 | int = 12 | spełniona | Przyjmij i zakończ |
Zmień działający program
Napisz funkcję checked_price, która zgłasza ValueError dla ujemnej ceny. Obsłuż wywołanie dla -1 i pokaż komunikat.
Pierwsza wskazówka
Zachowaj działający punkt wyjścia. Zlokalizuj konstrukcję wskazaną w poleceniu i zmień tylko ten etap. Przed uruchomieniem zapisz oczekiwany efekt.
Porównaj swoją modyfikację
def checked_price(price):
if price < 0:
raise ValueError("Cena nie może być ujemna")
return price
try:
print(checked_price(-1))
except ValueError as error:
print(error)
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
Cena nie może być ujemna
Znajdź przyczynę problemu
Celowo błędny przykład diagnostyczny. Najpierw postaw hipotezę. Nie kopiuj tej wersji jako poprawnego rozwiązania.
Zamierzone działanie: Przechwyć błąd konwersji słowa kot na liczbę.
try:
number = int("kot")
except TypeError:
print("Niepoprawna liczba")
Trop do diagnozy
Porównaj zamierzony rezultat z typami, nazwami i kolejnością instrukcji. Wskaż pierwsze miejsce, w którym zachowanie odbiega od celu.
Zastosuj w nowej sytuacji
Wskazówka do rozpoczęcia
Przechwytuj konkretny, przewidywalny wyjątek. Format danych i reguły ich dopuszczalności sprawdzaj osobno.
Zacznij od przygotowania danych. Pierwsza instrukcja przykładowego rozwiązania:
try:
Rozwiązanie do samodzielnej kontroli
try:
divisor = int(input("Dzielnik: "))
result = 10 / divisor
except ValueError:
print("Wpisz liczbę całkowitą")
except ZeroDivisionError:
print("Dzielnik nie może być zerem")
else:
print(result)
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
Dzielnik: 5.0
Wejście testowe: 2.
Porównaj dane wejściowe, wynik i powód użycia konstrukcji. Inna wersja kodu jest poprawna, jeśli realizuje te same wymagania.
Co zabierasz do kolejnego programu?
Przechwytuj konkretny, przewidywalny wyjątek. Format danych i reguły ich dopuszczalności sprawdzaj osobno.
Bez zaglądania do przykładu wyjaśnij własnymi słowami, jak główna konstrukcja prowadzi od danych do wyniku. Potem sprawdź wyjaśnienie, uruchamiając swój program.