Перейдите к следующему слайду, нажав кнопку Вправо
Ищем и исправляем ошибки в коде Python
Подготовлено онлайн-курсом
Не бойтесь. Искусство написания кода не в том, чтобы не допускать ошибки, а в том, чтобы уметь их исправлять.
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
Ошибки содержат в себе много информации. Даже слишком много, поэтому и выглядят пугающе.
Смотрите на последние строки, там написан тип ошибки и строка, на которой она возникла.
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
Тип ошибки
Строка ошибки, в этом случае седьмая
Раз у вас ошибка, код ведёт себя не так, как вы ожидаете. Проверьте содержимое переменных с помощью функции 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
Пустой список
Удобнее выводить название каждой переменной рядом с ней, чтобы было проще ориентироваться.
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
Не останавливайтесь просто на выводе переменной. Проверьте ещё и её тип. Например, строки и числа выглядят абсолютно одинаково.
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
Строки с числами складывать нельзя
По выводу в консоль не ясно строка это или число
Не останавливайтесь просто на выводе переменной. Проверьте ещё и её тип. Например, строки и числа выглядят абсолютно одинаково.
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
Строки с числами складывать нельзя
Теперь видно тип переменных
Если у вас эта ошибка и вы её не исправили, вернитесь к предыдущему слайду и проверьте код внимательнее.
Расставьте print внутри каждого if и for.
Проверьте, что условия выполняются так, как вы ожидаете и что на каждой итерации цикла все переменные такие, как должны быть.
Если ошибка на строке с несколькими действиями сразу, разбейте её на части и выполняйте по одному действию на каждой новой строчке.
Выведите результат каждого действия и найдите то место, где он отличается от ожидаемого.
Если ошибка происходит где-то внутри функции, поставьте в самом её начале print со всеми её аргументами.
Проверьте, что аргументы не перепутаны местами и что в них лежит то, что вы хотели передать.
Если в коде есть try except, стоит проверить блок кода внутри except. Исключение действительно перехватывается? Программа справляется с ошибкой?
Поставьте внутри try отладочный raise ErrorType, проверьте как поведет себя программа:
try:
...
# отладочный raise
raise SpecialError
...
except SpecialError:
# code for special case
...
Создано для онлайн-курса https://dvmn.org