Простой Python. Современный стиль программирования (Любанович) - страница 73

>··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(), которую мы обработали во втором, всеохватывающем обработчике.

Создание собственных исключений

В предыдущем разделе мы обсудили обработку исключений, но все исключения (такие как IndexError) заранее определены в Python или его стандартных библиотеках. Вы можете использовать любые из этих исключений в собственных интересах. Можете также определить собственные типы исключений, чтобы обрабатывать особые ситуации, которые могут возникнуть в ваших программах.