Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 102

138

Глава 4. Корочка Python: структуры кода

при каких обстоятельствах это произошло, и аккуратно завершить программу. Если

исключение сгенерировалось в функции и не было обработано, оно всплывает до

тех пор, пока не будет поймано соответствующим обработчиком в одной из вы-

зывающих функций. Если вы не предоставите собственный обработчик исклю-

чения, Python выведет сообщение об ошибке и некоторую информацию о том, где

произошла ошибка, а затем завершит программу, как показано в следующем фраг-

менте кода.

>>> short_list = [1, 2, 3]

>>> position = 5

>>> short_list[position]

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

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, а любое

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

139

другое исключение — в переменной other. В примере на экран выводится все, что

хранится в переменной other, чтобы показать, что вы получаете в этом объекте:

>>> short_list = [1, 2, 3]

>>> while True:

... value = input('Position [q to quit]? ')