Главная » Просмотр файлов » Лутц М. - Изучаем Python

Лутц М. - Изучаем Python (1077325), страница 158

Файл №1077325 Лутц М. - Изучаем Python (Лутц М. - Изучаем Python) 158 страницаЛутц М. - Изучаем Python (1077325) страница 1582018-01-10СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 158)

Например, класс бисер!топ имеет конструктор тптт, который автоматически присоединяет к экземплярам свои аргументы. В чем преимущества классов исключений? Поскольку в примере предыдущего раздела имеется всего три возможных исключения, он действительно не может продемонстрировать все преимущества применения классов исключений.

На самом деле мы могли бы достичь того же эффекта, указав в предложении ехсерт список имен строковых исключений в круглых скобках. Как это можно сделать, показано в файле в1 т!луехс ру г Зелега1 = депега1' Зрес1ттст = 'врос!т!ст' Зрес1ттс2 = 'врасту!с2' Оет гатвегО( и гатве Оепега1 оег га1вегт(): гатве зрестгтст Оет га1вег2(): та!ее Зрес111с2 Гог Гипс !л (гагвегО, та!ветх га!вег2): тгу: галс() ехсерт (Зепега1, Зрестттс1, Зрес!Гтс2): а перехватывает любие иэ этих терогт вув рг1пт саодпт:, вув.ехс !пто()(0) С:1рутпоп> рутпоп втг1пцехс.ру саоцлт цепега1 саоцш врес11!ст саоцпс врестттс2 Однако в случае больших или глубоких иерархий исключений может оказаться гораздо проще перехватывать категории, используя классы, чем перечислять в предложении ехсер1 все исключения, входящие в категорию. Кроме того, иерархии категорий можно расширять, добавляя новые подклассы, не ломая при этом существующий программный код.

Предположим, что вы занимаетесь разработкой библиотеки, реализующей функции обработки числовой информации, которая используется широким кругом людей. Во время работы над библиотекой вы обнаруживаете две ситуации, которые могут приводить к таким ошибкам, как деление на ноль и переполнение. Вы описываете эти ошибки как исключения, которые могут возбуждаться этой библиотекой, и определяете их как простые строки: В ~патл1тЬ.ру бтутего = Отювшп Ьу тего еггог тп 11Ьгагу от1ои = Вовег!с оуегт1ои еггог тп 1тогагу' 739 Исключения на основе классов сег гопс(): гагве б(чаете Теперь те, кто будет использовать вашу библиотеку, будут стремиться обертывать вызовы ваших функций или классов инструкцией сгу, чтобы перехватывать два ваших исключения (если они не будут перехватывать их, зти исключения будут приводить к аварийному завершению программ): и с)1епг.

ру 1врог1 еагл11Ь 1гу; вать11ь. гопс(... ) ехсерг (ваго)гь о(чаего, вагп11ь.о(1ои); ...вывод сообщения и восстановление после ошибки, Все работает просто замечательно и многие начинают использовать вашу библиотеку. Однако шесть месяцев спустя вы обнаруживаете еще одну ситуацию, которая может приводить к другой ошибке — потере значимых разрядов, после чего добавляете новое строковое исключение: в еа1Ь11ь.ру Огчгего = '01чгв1оп Ьу лего еггог 1п 1гЬгагу' оу1ои = 'Мсвеыс очаг(1ои еггог гп 1гЬгагу' от!ои = 'Мовег(с опоегт1ои еггог гп 1!Ьгагу' К сожалению, выпуском новой версии своей библиотеки вы создаете проблему для тех, кто ею пользуется. Если они явно указывали имена ваших исключений, теперь им придется вернуться к своим программам и внести соответствующие изменения везде, где производятся обращения к вашей библиотеке, чтобы включить вновь добавленное имя исключения: в с1(епс.ру гврог1 вагп11Ь ггу.

еагь1го.(опс(...) ехсерс (вагл1го.бгчаего, ваго(гЬ.Ь(1ои, еасп11Ь.ЬГ)ои): вывод сообщения и восстановление после ошибки.. Вероятно, это не конец света. Если ваша библиотека предназначена исключительно для внутреннего использования, вы могли бы внести все необходимые изменения самостоятельно. Вы могли бы также написать сценарий, который попытается ликвидировать проблему автоматически (едва ли такой сценарий будет насчитывать более дюжины строк, и на его создание уйдет совсем немного времени).

Однако, если многим людям придется изменять свой программный код всякий раз, Глава 28. Объекты исключений когда вы изменяете свой набор исключений, такая политика обновления определенно не будет расцениваться как самая вежливая, Ваши пользователи могут попытаться избежать этой ловушки, определяя пустые предложения ехсерт, которые перехватывают все исключения: а с1тепт ру тгу: шатс1тп.тепе(...) ехсерт; Ф Перекватвватв все исключении ...завод сообшенил и восстановление после ошибки... Но при таком решении могут перехватываться посторонние исключения, даже такие, которые вызваны опечатками в именах переменных, ошибками работы с памятью, и исключения, генерируемые программой при завершении, а для вас было бы нежелательно, чтобы перехваченные исключения ошибочно классифицировались как ошибки в библиотеке.

Как правило, при обработке исключений чем больше определенности, тем лучше (к этой идее мы еще вернемся в разделе с описанием типичных проблем, в следующей главе).' Так как же бытьем Исключения на основе классов полностью ликвидируют эту проблему. Вместо того чтобы определять библиотечные исключения как простой набор строк, их можно оформить в виде дерева классов с одним общим суперклассом, охватывающим целую категорию исключений: а за(П1тп Ру с1ава ЭиюЕгг(Ехсерттоп); рава с1ава ргчаего(эвзЕгг): Рава с1авв 0(1ои(аоюЕгг): Рава Оег (ипс() гатве РтчЕего() Как было предложено одним моим сообразительным студентом, в модуле библиотеки можно было бы определить кортеж, содержащий все исключения, которые могут быть возбуждены библиотекой.

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

Кроме того, ис. ключення, основанные на классах, несут в себе гораздо больше преимуществ по сравнению со строковыми исключениями, чем простое деление на категории, — они поддерживают возможность присоединять информацию о состоянии, обладают методами н используют механизм наследования. 741 Исключения на основе классов При таком подходе пользователям вашей библиотеки достаточно будет указать общий суперкласс (то есть категорию), чтобы перехватывать все исключения, возбуждаемые библиотекой, причем, как существующие, так и те, что появятся в будущем: В с1гапь ру гарогС аагл!гЬ ггу; аа(п1ть, гопс(.. ) вхсврс аасл1(Ь.НоаЕгг: .вывод сообщения и восстановление после ошибки.

Когда вы опять вернетесь к работе над библиотекой, новые исключения можно будет добавлять как новые подклассы от общего суперкласса: В аасл1тЬ. Ру с1ава 0(1ощ(яоаЕгг): Рава В результате программный код пользователей, перехватывающий исключения вашей библиотеки, останется работоспособным без каких- либо изменений. Вы свободно сможете добавлять, удалять и изменять исключения произвольным образом — пока клиенты используют имя суперкласса, они могут не беспокоиться об изменениях в вашем наборе исключений. Другими словами, исключения на основе классов лучше отвечают требованиям сопровождения, чем строки. Кроме того, исключения на основе классов могут поддерживать хранение информации о состоянии и наследование, чего не скажешь о строках — эти концепции мы будем исследовать на примере ниже в этой главе. Классы встроенных исключений Примеры в предыдущем разделе в действительности возникли не на пустом месте. Исключения, определяемые программой, могут быть представлены как в виде строк, так и в виде классов, однако все встроенные исключения, которые могут возбуждаться самим интерпретатором Руй)гоп, представляют собой объекты классов, а не строки.

Кроме того, они организованы в неглубокую иерархию с общими суперклассами категорий и подклассами определенных типов исключений, практически так же, как в примере выше. Все знакомые исключения, с которыми нам уже приходилось встречаться (например, Зупс ахЕ г го г), в действительности являются обычными классами, доступными в виде встроенных имен (в модуле Ьь(111п ) и в виде атрибутов модуля ехсерыопа, входящего в состав стандартной библиотеки. Кроме того, в языке Ру()гоп встроенные исключения организованы в иерархию с целью поддержки различных режимов перехвата исключений. Например: Глава 28. Объекты исключений Ехсер11оп Корневой суперкласс всех исключений.

31зпоагбЕггог Суперкласс всех встроенных исключений. АгттлювттоЕггог Суперкласс всех арифметических ошибок. Очег(1ощЕггог Подкласс, идентифицирующий конкретную арифметическую ошибку. И так далее. Подробнее познакомиться с этой структурой можно либо в справочном руководстве по библиотеке Ру1)топ, либо в тексте справки в модуле ехсерттопв (описание функции Пе1р приводится в главах 4 и 14): »> 1врог1 вховр11опв »> Пв1р(вховр11опв) объемный текст справки опущен...

Дерево встроенных классов позволяет определять, насколько конкретными или универсальными будут ваши обработчики исключений. Например, встроенное исключение АгттлаеттсЕггог — это суперкласс для таких более конкретных исключений, как Очес(1ощЕг го г и Ев гоОтчтюопЕгг. Указав имя Аг(тлав11сЕггог в инструкции 1гу, вы будете перехватывать все арифметические ошибки, а указав имя Очег11ощЕггог, вы будете перехватывать только ошибки определенного типа и никакие другие. Точно так же можно использовать 81апбагбЕггог, имя суперкласса всех встроенных исключений, для организации выбора между встроенными исключениями и исключениями, определяемыми программой, например: 1гу; 1гу.

асттоп() ехСЕР1 51апбагОЕггог: ...обработка встроенных исключений .. ехсер1: обработка исключений, опреаеляемык программой... е1ве; обработка случая отсутствия исключения... Использун имя корневого класса Ехсерттоп, можно очень близко имитировать поведение пустого предложения вхсер1 (которое перехватывает любые исключения). Однако это будет не полная имитация, так как в этом случае не будут перехватываться строковые исключения и исключения на основе отдельных классов, которые пока не обязательно должны быть подклассами корневого класса Ехсерыоп. 743 Исключения на основе классов Неважно, будете вы использовать категории в дереве встроенных классов или нет, этот подход служит отличным примером; при использовании подобных методов к созданию своих собственных исключений вы сможете реализовать гибкие наборы исключений, которые легко можно изменять.

Во всех других отношениях встроенные исключения практически неотличимы от первоначальной модели строковых исключений. Обычно вам даже не придется беспокоиться по поводу имеющихся различий, если, конечно, вы не исходите из предположения, что встроенные исключения являются строками, и не пытаетесь использовать их в операции конкатенации без необходимого преобразования (например, выражение КеуЕггог а "враз" будет приводить к ошибке, а выражение зсг(КеуЕггог) + "зраа" вполнедопустимо). Определение текста исключения Когда в начале главы мы знакомились с исключениями на основе строк, мы видели, что текст строки выводится в стандартный поток вывода сообщений об ошибках, когда исключение не обрабатывается программой (то есть, когда исключение достигает обработчика по умолчанию).

Характеристики

Тип файла
DJVU-файл
Размер
11,21 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6352
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее