Отладка кода

Перейдите к следующему слайду, нажав кнопку Вправо

Ищем и исправляем ошибки в коде Python

Подготовлено онлайн-курсом

https://dvmn.org

1. Не паникуйте

Не бойтесь. Искусство написания кода не в том, чтобы не допускать ошибки, а в том, чтобы уметь их исправлять.

title = input("Введите название фильма: ")
movies = find_movies_by_title(title)
if len(movies) > 1:
    show_movies_list(movies)
    movie = ask_user_for_movie(movies)
else:
    movie = movies[0]
Traceback (most recent call last):
  File "films.py", line 7, in <module>
    movie = movies[0]
IndexError: list index out of range

Ошибки выглядят страшно, пока вы не привыкли к ним.

2. Не смотрите в код, смотрите на ошибку

Ошибки содержат в себе много информации. Даже слишком много, поэтому и выглядят пугающе.

 

Смотрите на последние строки, там написан тип ошибки и строка, на которой она возникла.

title = input("Введите название фильма: ")
movies = find_movies_by_title(title)
if len(movies) > 1:
    show_movies_list(movies)
    movie = ask_user_for_movie(movies)
else:
    movie = movies[0]
Traceback (most recent call last):
  File "films.py", line 7, in <module>
    movie = movies[0]
IndexError: list index out of range

Тип ошибки

Строка ошибки, в этом случае седьмая

3. Проверьте содержимое переменных

Раз у вас ошибка, код ведёт себя не так, как вы ожидаете. Проверьте содержимое переменных с помощью функции print.

title = input("Введите название фильма: ")
movies = find_movies_by_title(title)
if len(movies) > 1:
	show_movies_list(movies)
	movie = ask_user_for_movie(movies)
else:
        print("Ищу ошибки")
        print(movies)
	movie = movies[0]
Ищу ошибки
[]

Traceback (most recent call last):
  File "films.py", line 9, in <module>
    movie = movies[0]
IndexError: list index out of range

Пустой список

3.1 Подписывайте, что выводите

Удобнее выводить название каждой переменной рядом с ней, чтобы было проще ориентироваться.

title = input("Введите название фильма: ")
movies = find_movies_by_title(title)
if len(movies) > 1:
	show_movies_list(movies)
	movie = ask_user_for_movie(movies)
else:
        print("movies: ", movies)
	movie = movies[0]
movies: []

Traceback (most recent call last):
  File "films.py", line 8, in <module>
    movie = movies[0]
IndexError: list index out of range

3.2 Проверяйте тип переменных

Не останавливайтесь просто на выводе переменной. Проверьте ещё и её тип. Например, строки и числа выглядят абсолютно одинаково.

str_one = "1"
int_one = 1

print("Это строка: ", str_one)
print("Это число: ", int_one)

two = str_one + int_one
Это строка:  1
Это число:  1
Traceback (most recent call last):
  File "num.py", line 7, in <module>
    two = str_one + int_one
TypeError: must be str, not int

Строки с числами складывать нельзя

По выводу в консоль не ясно строка это или число

3.2 Проверяйте тип переменных

Не останавливайтесь просто на выводе переменной. Проверьте ещё и её тип. Например, строки и числа выглядят абсолютно одинаково.

str_one = "1"
int_one = 1

print("Тип строки: ", type(str_one))
print("Тип числа: ", type(int_one))

two = str_one + int_one
Тип строки:  <class 'str'>
Тип числа:  <class 'int'>
Traceback (most recent call last):
  File "numbers.py", line 7, in <module>
    two = str_one + int_one
TypeError: must be str, not int

Строки с числами складывать нельзя

Теперь видно тип переменных

4. TypeError

Если у вас эта ошибка и вы её не исправили, вернитесь к предыдущему слайду и проверьте код внимательнее.

4. Расставьте больше print

Расставьте print внутри каждого if  и for.

 

Проверьте, что условия выполняются так, как вы ожидаете и что на каждой итерации цикла все переменные такие, как должны быть.

5. Разбейте сложные условия на части

Если ошибка на строке с несколькими действиями сразу, разбейте её на части и выполняйте по одному действию на каждой новой строчке.

 

Выведите результат каждого действия и найдите то место, где он отличается от ожидаемого.

6. Проверьте аргументы функции

Если ошибка происходит где-то внутри функции, поставьте в самом её начале print со всеми её аргументами.

 

Проверьте, что аргументы не перепутаны местами и что в них лежит то, что вы хотели передать.

7. Проверьте обработку исключений

Если в коде есть try except, стоит проверить блок кода внутри except. Исключение действительно перехватывается? Программа справляется с ошибкой?

 

Поставьте внутри try отладочный raise ErrorType, проверьте как поведет себя программа:

try:
    ...
    # отладочный raise
    raise SpecialError
    ...
except SpecialError:
    # code for special case
    ...

Создано для онлайн-курса https://dvmn.org