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

Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 95

Файл №1160791 Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004) 95 страницаБ. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791) страница 952019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Тогда система сможет функционировать в частично модифицированном соса оянии, полагаясь на динамическое (времени выполнения) обнаружение не ожидавшихся исключений. Это имеет большое значения для сопровождения больших сне~ем, в которых значительные модификации являются очень дорогим удовольствием и не весь исходный код доступен. Виртуальная функция может быть замещена функцией с не менее ограничительной спецификацией исключений, чем ее собственная. Например: 431 14.6. Спецификации исключений Это правило соответствует здравому смыслу.

Вели производный класс генерирует исключение, которос не указано в спецификации исходной функции, вызывающая функция может не ожидать его. С другой стороны, замешенная функция, генерирующая меньше исключений, очевидно подчиняется спецификации исключений замещаемой функции. Аналогичным образом вы можете присвоить указатель на функцию с более ограничительной спецификацией исключений указателю на функцшо с менее ограничительной спецификацией исключений, но не наоборот. Например: ооЫЯ) Гйгош (Х), ооЫ ("р~1) () Ягош (Х У)= Рф г/провально ооЫ ("рЯ () Йгош () = Рф /гг оагабка В частности, вы не можете присвоить указатель на функцию без спецификации ис- ключений указателю на функцию, которьш ее имеет: )) может сгвнераровогпьлюбов нгклюкенне ооЫи(); ооЫ ('р)б) 0 гбгош (Х) = Ъя; г'гг огиибка Спецификация исключений не является частью типа функции, и ~урег1е~не може~ ее содержать.

Например: Гуребе~ооЫ (*Рг) () бггош(Х), г',г ошибка 14.6.2. Неожидаемые исключения Спецификация исключений может привести к вызовам ипехрес1еб (). Как правило, кроме как па этапе тестирования, такие вызовы нежелательны. От нпх можно избавится путем тщательной организации исключений н спецификаций интерфейса.

С другой стороны, вызовы ииехрес~еН () можно перехватывать таким образом, что они становятся безвредными. Все исключения хорошо определенной подсистемы Узачастую являются производными от некоего класса Уегт. Например, при наличии определения с!авв Яотв Уегг: рабус Уеп ( гг* ... 'гг ); функция, объявленная ооЫЯ Г)ггогв ',Хелп Уеп., ехсериоп); передаст любое Уегг вызывающей функции. В частности, /'0 будет обрабатывать Яогпе уегг, передавая его в вызывающую функцию. Таким образом, никакое исключение Уегг в)г() не запустит ипехрес~еи (). Все исключения, генерируемые стандартной библиотекой, являются производными от класса ехсернол Я 14.10).

14.6.3. Отображение исключений Политика завершения программы при обнаружении неожидаемого исключения иногда оказывается слишком жесткой. В таких случаях поведение ипехрес~егг () должно быть изменено, чтобы добиться чего-то более приемлемого. Глава 14. Обработка исключений 432 Простейшим способом достижения этой цели является добавление исключения стандартной библиотеки к1йсЬай ехсер1(оп в спецификацию исключений. В этом случае ипехрес1ей() вместо вызова функции просто сгеыерирует Ьай ехсер11оп. Например: с1аккХ(), с1акк У(), во1йТ () 1Ьгаил (Х, к1йсЬай ехсерйаа) ( 1',1 .. 1Ьташ У(); О ггнераиия «ялохвгв» исключения Спецификация исключений отловит неприемлемое исключение Уи сгеыерирует исключение типа Ьай ехсер1(оп. В Ьай ехсер11оп нет ничего особенно плохого ()эаг(); оно просто предоставляет механизм, который менее радикален, чем вызов 1еггакпа1е ().

Однако оы еще достаточно сырой. Б частности, информация о том, какое исключение вызвало проблему, теряется. 14.б.3.1. Отображение исключений пользователем Рассмотрим функцию Ьт(), написанную для несетевого окружения. Предположим далее, что я () была объявлена со спецификацией исключений таким образом, что она может сгенерировать исключения, имеющие отношение только к ее «подсистеме Утс ио1й я ()1ьгато (Уеп Ь Теперь предположим, что нам потрсбовалось вызвать д () в сетсвом окружении.

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

Исчерпание памяти обрабатывается пеи» Ьапй1ег, задаваемым ке1 песк Ьапй1ег(), Аны1огично, реакция на неожидаемые исключения определяется ипехрес1ей Ьапй1ег, задаваемым ке1 ипехрес1ей () из <ехсер11оп>; гиргйеГиагй ('ипехрес1ей Ьаай1ет) (); ипехргс1ей Ьвлй(ст ке1 ипехргс1ей (ииехрес1ей Ьапй(ет) (1 Для того чтобы обрабатывать неожидаемые исключения так, как нас это устраивает, мы сначала определим класс, который позволит цам использовать технику «выделение ресурса есть инициализация» для функции ипехрес1ей (): с1акк БТС( 11 сохранить и воск»наловить иагхресгей Ьаай(ет о(й; риЫ1с; ЬТС (ивехрес1ей Ьалй(етЯ ( а!й = ке1 ипехрес1ей (1); ) 433 14.6. Спецификации исключений -ЗТС () ( гег ипгхрвс1вй (о1й), ) ), Теперь мы определим функцию с тем смыслом, который хотим для ипехрес1ей () в данном случае: г1авв Уипехрестей; риЬйс Уетт(]; оо(й Мгою У() 1Ьгою (уипвхрвс1ей) (1Ьгою уипгхрестей (), ) Будучи использованной в качестве ипехрес1ей (), функция МготоУ() отображает все неожидаемые исключения в Уипехрес1ей Наконец, мы предоставляем версию функции р (), работающую в сетевом окружении: оо1й пе1юотуей у () Мгою (Уетг) ( ЬТСхх (й)Ь оюУ1 //теперь иагхргг1вй() // генерирует Уипгхрес1гй у(); Так как Уипехрес1ей является производным от Уегг, спецификация исключений не нарушается.

Если бы МготаУ() генерировала исключение, которое нарушает спецификацию исключений, была бы вызвана функция 1еггп)па1в (). Сохраняя и восстанавливая ипехрес1ей Ьапй1ег, мы предоставляем нескольким подсистемам возможность управлять обработкой неожидаемых исключений, не входя в зависимость друг от друга. В основном техника отображения неожидаемых исключений в ожидаемые является более гибким вариантом того, что предлагает система в форме Ьай ехсер1)оп. 14.6.3.2. Восстановление типа исключения Отображение неожидаемых исключений в Уипехрес1ей позволит пользователю пе1юогйей я() узнать, что некоторое неожидаемое исключение отображено в Уипехрес1ей.

Однако пользователь не будет знать, какое именно исключение отображено. Эта информация была потеряна в МгоптУ(). Простой метод позволяет записать эту информацию и передать ее. Например, мы можем собрать информацию о Ьге1- юогЬ ехсер1(оп следующим образом: с(авв Уипгхресгей: риЫ1с Угтг( риЫ1с. Ьгеиоогу ехсгрноп' рв, уипгхрггтвй ()чг)юогЬ гхсерйоп' р); рв )р)р-'с)опг(): 0) ( ) -Уипехрвстгй () (йе1г1е р;) оогй 1Ьгою У() Мтотв (Уипгхресгей) ( тту ( Мгою; // сгенерировать заново, // ч тоби немедленно пгргхватаить! са1сЬ ~ХвниогЬ гхсервопй р) ( Мгою Уиагхрестей (Ьр); // сгенерировать отображенное исключение 434 Глава 14, Обработка исключений са1сА (..)( 1Ьгоге Уилехрес1ег! (О); Повторная генерация исключения и его перехват позволяют нам создать обработчик исключений любых типов, имена которых мы знаем.

Функция 1ЬгошУ() вызывается из ипехрес1ее((), которая концептуально вызывается из обработчика са1сЬ (...). Поэтому некоторое исключение определенно существует и его можно сгенерировать заново. Функция ипехрее1ег! () не может проигнорировать исключение и вернуть управление. Если она попытается, сама ипехрес1еН () сгенерирует Ьад ехсер1!оп (ф 14.6.3), Функция с!опе() попользуется для размещения копии исключения в свободной области памяти.

Эта копия будет существовать и после того, как обработчик исключений очистит локзльные переменные. 14.7. Неперехеаченные исключения Если исключение сгспсрировапо, но цс псрсхвачсно, вызывается функция зЫз1егтта1е (). Функция!егтта1е () будет также вызвана, если механизм обработки исключения обнаружит, что стек разрушен, и если деструктор, вызванный во время обусловленной исключением раскрутки стека, пытается завершить свою работу при помощи исключения.

Неожидаемые исключения обрабатываются ипехрес1ег! Ьап!!!ег, задаваемым функцией зе! ипехрес1ег! Ьапг11ег (). Подобным образом реакция на неперехваченные исключения определяются ипсаидЬ! Ьат11ег, задаваемым функцией зе1 1егтта1е (): 1урейеХзо!П ("гегтта!е дал<Пег) (), !егт!ла!е Бапг!!егзе! !егт!па1е (!егтгааге Ьапг!!е4 Возвращаемым значением является предыдущая функция, переданная зе! 1егтта!е (). Суть 1егт!па1е () заключается в том, что вместо обработки исключений иногда следует использовать менее изощренную технику обработки ошибок.

Например, 1егт1па!е () могла бы использоваться для прекращения процесса или для повторной инициализации системы. Функция 1егтгаа!е() является радикальным средством, применяемым, когда стратегия восстановления после ошибок, реализованная при помощи механизма обработки исключений, потерпела неудачу, и пришло время перейти на другой уровень борьбы с ошибками. По умолчанию 1егтгаа1е () вызовет функцию абог! () (З 9.4.1.1). Это умолчание является хорошим вариантом для большинства пользователей — особенно во время отладки. Предполагается, что обработчик ипеаийЬ! Ьапг!!ег не возвращает управление в вызвавшую программу. Если он попытается, !егт!па1е () вызовет аЬог! ().

Обратите внимание, что вызов функции аЬог! () означает ненормальный выход из программы. Можно воспользоваться функцией ех!! () для выхода из программы с возвращаемым значением, которое укажет внешней сит смс, был ли выход нормальным или нет (9 9.4.1.1). Вызываются ли деструкторы при прекращении выполнения программы из-за неперехваченного исключения, зависит от реализации. Для некоторых систем важно, чтобы деструкторы не вызывались; тогда программа сможет возобновить 485 14.8 Исключения и эффективность выполнение в среде отладчика.

В других системах с точки зрения архитектуры почти невозможно не вызывать деструкторы во время поиска подходящего обработчика. Если вы хотите гарантировать очистку при возникновении неперехваченных исключений, вы можете включить в таш () обработчик, «перехватывающей все» Я 14.3,2) в дополнение к обработчикам исключений, которые действительно имеют для вас значение. Например: га! та!л () си( !',!" ) са!сЬ (зй( галде еггог) ( сегг «: ошибка диапазона~,п' са!сй (з!д Ьад а(!ос) ( сап «" нею исчерпал нагнять\а', сагсЬ ( )( //..

Эта конструкция перехватит любое исключение, не считая тех, которые сгенсрированы при конструировании и уничтожении глобальных переменных. Не существует способа перехвата исключений, сгенерированных во время инициализации глобальных переменных. Единственным способом обеспечения контроля в случае генерации исключения в инициалпзаторе пелокального статического объекта является зе! ипехрес(ег! () Я 14.6.2). Это еше одна причина избегать, где возможно, глобальных переменных. При перехвате исключения точное место, где оно сгенерировано, вообще говоря неизвестно.

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

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

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

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