>··File "", line 1, in
>IndexError: list index out of range
Вместо того чтобы отпускать события на волю случая, размещайте свой код в блоке try и используйте блок except, чтобы обработать ошибку:
>>>> short_list = [1, 2, 3]
>>>> position = 5
>>>> try:
>…·····short_list[position]
>… except:
>…·····print('Need a position between 0 and', len(short_list)-1, ' but got',
>…············position)
>…
>Need a position between 0 and 2 but got 5
Запускается код внутри блока try. Если произошла ошибка, генерируется исключение и выполняется код, расположенный внутри блока except. Если ошибок не произошло, блок except будет опущен.
Отсутствие аргументов в блоке except, как показано в предыдущем примере, позволяет ловить исключения любого типа. Если может сгенерироваться более одного исключения, лучшим решением будет предоставить отдельный обработчик для каждого из них. Никто не заставляет вас делать это — можете использовать блок except без аргументов, но ваша обработка будет более общей (что-то вроде вывода на экран строки Произошла ошибка). Вы можете использовать любое количество обработчиков исключений.
Иногда вам может понадобиться получить не только тип исключения. Вы можете получить объект исключения целиком в переменной имя, если используете следующую форму:
>except тип_исключения as имя
В следующем примере выполняется проверка на IndexError, поскольку именно это исключение вызывается, когда вы предоставляете недействительную позицию последовательности. Исключение IndexError сохраняется в переменной err, а любое другое исключение — в переменной other. В примере на экран выводится все, что хранится в переменной other, чтобы показать, что вы получаете в этом объекте:
>>>> short_list = [1, 2, 3]
>>>> while True:
>…·····value = input('Position [q to quit]? ')
>…·····if value == 'q':
>…·········break
>…·····try:
>…·········position = int(value)
>…·········print(short_list[position])
>…·····except IndexError as err:
>…·········print('Bad index:', position)
>…·····except Exception as other:
>…·········print('Something else broke:', other)
>…
>Position [q to quit]? 1
>2
>Position [q to quit]? 0
>1
>Position [q to quit]? 2
>3
>Position [q to quit]? 3
>Bad index: 3
>Position [q to quit]? 2
>3
>Position [q to quit]? two
>Something else broke: invalid literal for int() with base 10: 'two'
>Position [q to quit]? q
Ввод позиции 3, как и ожидалось, генерирует исключение IndexError. Ввод слова two не понравился функции int(), которую мы обработали во втором, всеохватывающем обработчике.