Python • kurs podstawowy • lekcja 29
Błędy, traceback i pierwsze debugowanie
Program może nie dać się odczytać (błąd składni), przerwać działanie wyjątkiem albo działać z niewłaściwym wynikiem.
Twój cel: Odczytasz komunikat błędu, postawisz hipotezę i sprawdzisz małą poprawkę.Typy danych i wykonywanie prostych programów.
Co ma zrobić program?
Każdy przypadek wymaga porównania z zamiarem. Brak wyjątku nie jest dowodem poprawności obliczenia.
Traceback pokazuje drogę wywołań prowadzącą do wyjątku. Czytaj końcową linię: typ i opis. Potem znajdź ostatni wskazany fragment własnego kodu, plik i numer linii. Miejsce wykrycia problemu może być późniejsze niż jego przyczyna, np. tekst pobrano wcześniej przez input().
NameError oznacza brak dostępnej nazwy, TypeError nieodpowiedni typ dla operacji, ValueError nieodpowiednią wartość dla danej operacji, np. int("kot"). SyntaxError to problem składni. Zapisz oczekiwany wynik, sprawdź wartości lub type(), zmień jedną rzecz i ponów test. Nie poprawiaj naraz wielu niezależnych linii.
Przewidź przed uruchomieniem
number = 10
text = "5"
print(number + int(text))
print(text + str(number))
Porównaj wynik i prześledź mechanizm
15 oraz 510. Pierwsza konwertuje tekst do int i dodaje liczby. Druga zamienia 10 na napis i skleja teksty; działa bez wyjątku, ale nie oblicza sumy.
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
15
510
| Objaw | Hipoteza | Kontrola |
|---|---|---|
| TypeError dla 10 + "5" | Niezgodne typy | type obu wartości |
| NameError dla score | Brak lub literówka nazwy | Miejsce przypisania |
| Wynik 510 zamiast 15 | Sklejanie zamiast dodawania | Cel i użyta konwersja |
Zmień działający program
Wyświetl typ obu wartości przed obliczeniem, aby sprawdzić hipotezę o różnych typach.
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ę
number = 10
text = "5"
print(type(number))
print(type(text))
print(number + int(text))
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
<class 'int'>
<class 'str'>
15
Znajdź przyczynę problemu
Celowo błędny przykład diagnostyczny. Najpierw postaw hipotezę. Nie kopiuj tej wersji jako poprawnego rozwiązania.
Zamierzone działanie: Oblicz sumę 10 i tekstowo zapisanej liczby 5.
number = 10
text = "5"
print(number + text)
Przykładowy komunikat dla tego kodu zapisanego jako error.py. Dokładna ścieżka i dodatkowe wskazania mogą zależeć od środowiska:
Traceback (most recent call last):
File "error.py", line 3, in <module>
print(number + text)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Ostatnia linia nazywa problem. Wiersz z File wskazuje plik i numer linii do zbadania. Tutaj obie wartości pochodzą z dwóch wcześniejszych przypisań.
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
Komunikat jest wskazówką. Poprawność to zgodność z celem potwierdzona testem, a nie tylko brak wyjątku.
Zacznij od przygotowania danych. Pierwsza instrukcja przykładowego rozwiązania:
a = 4
Rozwiązanie do samodzielnej kontroli
a = 4
b = 8
print((a + b) / 2)
a = 2
b = 10
print((a + b) / 2)
Wynik kontrolny dla danych z przykładu. Wpisane odpowiedzi użytkownika nie są tutaj powtarzane:
6.0
6.0
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?
Komunikat jest wskazówką. Poprawność to zgodność z celem potwierdzona testem, a nie tylko brak wyjątku.
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.