Błędy, traceback i pierwsze debugowanie

Preview Mode

You're viewing this material in preview mode. Sign up to track your progress and access all features.

Błędy, traceback i pierwsze debugowanie
Required In Progress

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
Komunikat jest wskazówką. Poprawność to zgodność z celem potwierdzona testem, a nie tylko brak wyjątku.
Komunikat jest wskazówką. Poprawność to zgodność z celem potwierdzona testem, a nie tylko brak wyjątku.

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
Model do prześledzenia: porównaj każdy etap z kodem. Etykiety opisują znaczenie danych, nie tylko ich wygląd.

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.