Главная » Просмотр файлов » Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 92

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 92 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 922018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Это не изменит набор исключений, который мы можем перехватить, а лишь оградит нас от изменения обьекта исключения. В принципе, исключение при генерации копируется, так что обработчики имеют дело с копиями оригинальных исключений. Исключение может быть даже несколько раз скопировано перед тем, как будет перехвачено для обработки. Отсюда следует, что мы не можем сгенерировать некопируемое исключение.

Конкретные реализации могут применять разные стратегии для хранения и передачи исключений. Всегда, однако, гарантируется, что хватит памяти для генерации операцией петк стандартного исключения нехватки памяти ЬаФ аеас (514.4.5). 14.3.1. Повторная генерация исключений Перехватив исключение, обработчик рассматривает его и может иногда прийти к выводу, что сам он не в состоянии выполнить исчерпывающую обработку этого исключения. Тогда он делает ту часть работы, которая ему по плечу, после чего вновь генерирует это же исключение.

В результате, исключение может обрабатываться там, где это наиболее уместно. Это возможно даже в случаях, когда необходимая для обработки исключения информация не сосредоточена в единственном месте программы, и лучше всего обработку рассредоточить по нескольким обработчикам. Например; Глава ) 4. Обработка исключений 442 иоИ й ( ) ( ггу ( // код, который может генерировать "математические" исключение ) сизой (Магйегг) ( (1(саи иаийе й сотр)еге!у) ( // обработать л(айегг ге(игл г ) еае ( // делаем здесь то, что можем йгоиц // повторно генерируем исключение ) ) Повторная генерация исключения обозначается ключевым словом гйгои, за которым не указывается никакого выражения. Если пытаться выполнить такой оператор в отсутствие исключений, то будет вызвана функция гегиниаге() 5!4.7).

Компиляторы могут (но не всегда) предупреждать о таких ошибках. Повторно сгенерированное исключение есть точная копия оригинального исключения, а не его часть, что была доступна как Майегг. Другими словами, если было сгенерировано исключение типа 1иг оуегЯои, то функция, вызвавшая й (), может по-прежнему перехватывать исключение типа 1иг окетЯои, несмотря на то, что в самой функции Ь () исключение перехвачено с типом Майегг.

14.3.2. Перехват любых исключений Бывает полезна и вырожденная версия описанной выше техники повторной генерации исключений. Как и для функций, где многоточие означает «любой аргумент» (57.6), сагой (... ) означает «перехватить любое исключение». Например: »оЫ ги () ( ( // юпо-либо ) сагой (... ) // обработка любых исключений ( // обработка (очистка) (игоич То есть если основная часть функции т () сгенерирует любое исключение, в обработчике будут выполнены необходимые при этом завершаюшне действия (очист- 14.3. Перехват исключений ка — с1еалцр).

После выполнения локальной очистки исключение генерируется заново, чтобы имелась возможность выполнить в иных местах программы дополнительную обработку исходной ошибки. В 514.6.3.2 рассмотрена техника получения информации об исключении в обработчике с многоточием. Важным аспектом обработки ошибок вообще и обработки исключений в частности является поддержка инвариантов программы 524.3.7.1).

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

14.3.2.1. Порядок записи обработчиков Поскольку исключение производного типа может перехватываться несколькими обработчиками, порядок, в котором в коде представлены эти обработчики, важен. Дело в том, что отбор обработчиков выполняется в соответствие с этим порядком. Например: гюй(3'( ) ( ггу ( !!...

) савей (хга::гов Ьаве: За!!иее) !!обработка любых ошибок нотокового ввода/вывода Я!4.)0) ) сагой (вй(:: ехсербоий е) ( гУ обработка любых исключений стандартной библиотеки (3!4. )0) ) сагой (... ) ( )!обработка любых других исключений ф!4.3.2) ) ) Поскольку компилятор разбирается в иерархии классов, он может выявить многие логические ошибки. Например: иоЫя() ( ау ( У... ) сагой (... ) ( !! обработка любых исключений 6)4.3.2) Глава ) 4.

Обработка исключений 444 сама (за(:: ехсербоп а е) ( ~У обработка любых исключений стандартной библиотеки Гз!4.!б! ) сазсЬ (зЫ::Ьай саз!) ( !! обработка исключении из операции йупат(с саз! Я!5.4.2! ) Здесь обработчик исключений типа ехсерпоп никогда не будет выполняться. Даже если мы уберем обработчик с многоточием, то Ьаб сам никогда не будет рассматриваться, потому что тип Ьа~1 сает является производным от ехсерпоп. 14.4. Управление ресурсами Если функция получает некоторый ресурс (открывает файл, динамически получает блок свободной памяти, устанавливает блокировку доступа и т.д.), то для будущего функционирования системы очень важно, чтобы этот ресурс бьш впоследствии корректно освобожден. Часто сама функция и освобождает ресурсы перед возвратом.

Например: иоЫ изе 1!!е (сопл! сапе* 1п) ( Еу!.Е* у=!преп (!и, "ьт ); ~У используем !' 5с!озе (1); ) Это выглядит приемлемым решением до того момента, как мы задумаемся о том, что будет в случае возникновения исключения после вызовауореп () и до вызова 1с1озе()? Ведь в этом случае возможен выход из азе у!1еы без вызова 1с!озе() . Эта проблема характерна для языков программирования, не содержащих встроенных средств обработки исключений.

Например, стандартная библиотечная функция 1оп4!зпр () языка С запросто может вызвать подобного рода проблемы. Даже простейший оператор гешгп может завершить азе уИе (), оставив файл открытым. Первая попытка сделать функцию азе И!е() устойчивой к таким ошибкам выглядит следующим образом: той! иле!)!е (санга сйас*1п) ( РггЕ* !=уорен (уп, "с" ); ( у! используем ! ) са(са (... ) ( 5с!озе (1); 14.4. Управление ресурсами 445 1«гоп ! ) ус(озе (1) ! ) Использующий файл код заключен в блок «у, что обеспечивает здесь перехват любых исключений, закрытие файла и повторную генерацию исключения.

Проблема с этим решением состоит в том, что оно слишком многословное, утомительное и потенциально дорогостоящее. Более того, любое многословное и утомительное решение подвержено ошибкам, ибо программисту оно надоедает. Но к счастью, существует более элегантное решение. Представим общую постановку проблемы в следующем виде: гоЫ асс!и!ге ( ) ( гг' выделяем ресурс 1 р,..

о' выделяем ресурс и !! используем ресурсы Р освобождаем ресурс и !.., Р освобождаем ресурс ! ) В типичном случае ресурсы должны освобождаться в порядке, обратном порядку их выделения. Это сильно напоминает поведение локальных объектов, создаваемых конструкторами и уничтожаемых деструкторами. Следовательно, проблему получения и освобождения ресурсов можно решить с помощью объектов классов, располагающих надлежащими конструкторами и деструкторами. Например, мы могли бы определить класс Р!1е ргг, ведущий себя как указатель на файл (то есть как тип НЕЕ*): с1аев Г!!е р«. ( Р1ЕЕ* р! риЫ!с: Н(е ргг (сопл! с«аг* и, сопи с«аг* а) (р = 1ореп (и, а); ) Г!!е ргг (Е1ЕЕ* рр) (р = рр; ) гу подлодяи(ие операции яопироваиия -Л1е ргг() ( (!'(р) ус!ож (р); ) орегагог Р11 Е* ( ) (ге!ига р; ) ): Объекты типа !гз1е ргг создаются либо на базе НЕЕ*, либо на базе информации, необходимой функции уореп ( ) .

В любом случае, объект будет автоматически уничтожен по выходу из области видимости, а деструктор закроет ассоциированный с ним файл. Наша функция сократилась теперь до минимума: гоЫ изе Яе (сопл! с«аг* уп ) ( Р!!е рггу'(уп, "г" ); (г используем ! Глава 14. Обработка исключений 446 Деструктор будет вызван независимо от того, завершается ли функция нормальным образом или по исключению. Таким образом, механизм обработки исключений позволил нам удалить код обработки ошибок из реализации основного алгоритма задачи. Результирующий код проще и менее подвержен внесению случайных ошибок, чем традиционный вариант.

Процесс восходящей обработки стека вызовов с целью обнаружения подходящего обработчика исключения обычно называют раскруткой сл)ека (згас(с или)ий(щ). По мере постепенной раскрутки стека вызовов для всех локально сконструированных в них объектов гарантированно вызываются деструкторы. 14.4.1. Использование конструкторов и деструкторов Техника управления ресурсами через локальные объекты называется так: «получение ресурса есть инициализация».

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

Конструктор выполняет попытку корректно и в полном объеме сконструировать объект. Когда же не удается это сделать, хорошо написанный конструктор восстанавливает (насколько возможно) исходное состояние системы. В идеале, конструкторы должны реализовывать одну из этих альтернатив, никогда не оставляя объекты в полуподготовленном состоянии. Этого можно добиться, применяя к членам класса принцип «получение ресурса есть инициализация». Рассмотрим класс Х конструктор которого должен получить два ресурса — файл х и блокировку у. В процессе получения ресурсов может генерироваться исключение, сигнализирующее о недоступности ресурса.

Конструктор класса Хне должен нормальным образом завершать работу в том случае, когда файл получен, а блокировка оказалась недоступной. Эту проблему можно решить элегантно (без излишней нагрузки на программиста). Для приобретения указанных ресурсов, используем классы Л!е рг«и Хоай рг«, соответственно. Получение ресурса формулируем в виде инициализации локальных объектов, представляющих эти ресурсы: с!аез Х ( рде р««аа; бось р«« ЬЬ; риЫ(с: Х (соим сьа«' х, соиз( сьа«* у) : аа(х, "«и"), // ириобре«иаем 'х' : ЬЬ (у) о'ириобретаем 'у' 447 14.4.

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

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

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

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