Глава 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]? ')