Главная » Просмотр файлов » С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс

С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944), страница 92

Файл №1114944 С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (С.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс) 92 страницаС.Б. Липпман, Ж. Лажойе - Язык программирования С++ Вводный курс (1114944) страница 922019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Кпримеру, функция захватила некоторый ресурс, скажем открыла файл или выделилаvoid manip() {resource res;res.lock();// захват ресурса// использование ресурса// действие, в результате которого возбуждено исключениеres.release();// не выполняется, если возбуждено исключениепамять из хипа, и этот ресурс необходимо освободить перед выходом:}Если исключение возбуждено, то управление не попадет на инструкцию, где ресурсосвобождается.

Чтобы освободить ресурс, не пытаясь перехватить все возможныеисключения (тем более, что мы не всегда знаем, какие именно исключения могутвозникнуть), воспользуемся специальной конструкцией, позволяющей перехватыватьлюбые исключения. Это не что иное, как предложение catch, в котором объявлениеисключения имеет вид (...) и куда управление попадает при любом исключении.Например:С++ для начинающих535// управление попадает сюда при любом возбужденном исключенииcatch (...) {// здесь размещаем наш код}Конструкция catch(...) используется в сочетании с повторным возбуждениемисключения. Захваченный ресурс освобождается внутри составной инструкции в catchобработчике перед тем, как передать исключение по цепочке вложенных вызовов вvoid manip() {resource res;res.lock();try {// использование ресурса// действие, в результате которого возбуждено исключение}catch (...) {res.release();throw;}res.release();// не выполняется, если возбуждено исключениерезультате повторного возбуждения:}Чтобы гарантировать освобождение ресурса в случае, когда выход из manip()происходит в результате исключения, мы освобождаем его внутри catch(...) до того,как исключение будет передано дальше.

Можно также управлять захватом иосвобождением ресурса путем инкапсуляции в класс всей работы с ним. Тогда захватбудет реализован в конструкторе, а освобождение – в автоматически вызываемомдеструкторе. (С этим подходом мы познакомимся в главе 19.)Предложение catch(...) используется самостоятельно или в сочетании с другими catchобработчиками. В последнем случае следует позаботиться о правильной организацииобработчиков, ассоциированных с try-блоком.Catch-обработчики исследуются по очереди, в том порядке, в котором они записаны. Кактолько найден подходящий, просмотр прекращается.

Следовательно, если предложениеcatch(...) употребляется вместе с другими catch-обработчиками, то оно должно бытьtry {stack.display();for ( int ix = 1; ix < 51; ++x ){// то же, что и выше}}catch ( pushOnFull ) { }catch ( popOnEmpty ) { }последним в списке, иначе компилятор выдаст сообщение об ошибке:catch ( ... ) { }Упражнение 11.4// должно быть последним в списке catch-обработчиковС++ для начинающих536Объясните, почему модель обработки исключений в C++ называется невозвратной.Упражнение 11.5Даны следующие объявления исключений. Напишите выражения throw, создающие(a) class exceptionType { };catch( exceptionType *pet ) { }(b) catch(...) { }(c) enum mathErr { overflow, underflow, zeroDivide };catch( mathErr &ref ) { }(d) typedef int EXCPTYPE;объект-исключение, который может быть перехвачен указанными обработчиками:catch( EXCPTYPE ) { }Упражнение 11.6Объясните, что происходит во время раскрутки стека.Упражнение 11.7Назовите две причины, по которым объявление исключения в предложении catch следуетделать ссылкой.Упражнение 11.8На основе кода, написанного вами в упражнении 11.3, модифицируйте класс созданногоисключения: неправильный индекс, использованный в операторе operator[](), долженсохраняться в объекте-исключении и затем выводиться catch-обработчиком.

Изменитепрограмму так, чтобы operator[]() возбуждал при ее выполнении исключение.11.4. Спецификации исключенийПо объявлениям функций-членов pop() и push() класса iStack невозможно определить,что они возбуждают исключения. Можно, конечно, включить в объявление подходящийкомментарий. Тогда описание интерфейса класса в заголовочном файле будет содержатьclass iStack {public:// ...void pop( int &value );void push( int value );// возбуждает popOnEmpty// возбуждает pushOnFullprivate:// ...документацию возбуждаемых исключений:};Но такое решение несовершенно.

Неизвестно, будет ли обновлена документация привыпуске следующих версий iStack. Кроме того, комментарий не дает компиляторудостоверной информации о том, что никаких других исключений функция не возбуждает.Спецификация исключений позволяет перечислить в объявлении функции всеС++ для начинающихисключения, которые она может возбуждать. При этом гарантируется, что другиеисключения функция возбуждать не будет.Такая спецификация следует за списком формальных параметров функции.

Она состоитиз ключевого слова throw, за которым идет список типов исключений, заключенный вскобки. Например, объявления функций-членов класса iStack можно модифицировать,class iStack {public:// ...void pop( int &value ) throw(popOnEmpty);void push( int value ) throw(pushOnFull);private:// ...добавив спецификации исключений:};Гарантируется, что при обращении к pop() не будет возбуждено никаких исключений,кроме popOnEmpty, а при обращении к push()–только pushOnFull.Объявление исключения – это часть интерфейса функции, оно должно быть задано при ееобъявлении в заголовочном файле. Спецификация исключений – это своего рода“контракт” между функцией и остальной частью программы, гарантия того, что функцияне будет возбуждать никаких исключений, кроме перечисленных.Если в объявлении функции присутствует спецификация исключений, то при повторномобъявлении этой же функции должны быть перечислены точно те же типы.Спецификации исключений в разных объявлениях одной и той же функции не// два объявления одной и той же функцииextern int foo( int = 0 ) throw(string);// ошибка: опущена спецификация исключенийсуммируются:extern int foo( int parm ) { }Что произойдет, если функция возбудит исключение, не перечисленное в ееспецификации? Исключения возбуждаются только при обнаружении определенныханомалий в поведении программы, и во время компиляции неизвестно, встретится ли тоили иное исключение во время выполнения.

Поэтому нарушения спецификацииисключений функции могут быть обнаружены только во время выполнения. Еслифункция возбуждает исключение, не указанное в спецификации, то вызываетсяunexpected() из стандартной библиотеки C++, а та по умолчанию вызываетterminate(). (В некоторых случаях необходимо переопределить действия, выполняемыефункцией unexpected(). Стандартная библиотека предоставляет механизм для этого.Подробнее см. [STRAUSTRUP97].)Необходимо уточнить, что unexpected() не вызывается только потому, что функциявозбудила исключение, не указанное в ее спецификации.

Все нормально, если онаобработает это исключение самостоятельно, внутри функции. Например:537С++ для начинающихvoid recoup( int op1, int op2 ) throw(ExceptionType){try {// ...throw string("we're in control");}// обрабатывается возбужденное исключениеcatch ( string ) {// сделать все необходимое}}// все хорошо, unexpected() не вызываетсяФункция recoup() возбуждает исключение типа string, несмотря на его отсутствие вспецификации. Поскольку это исключение обработано в теле функции, unexpected() невызывается.Нарушения спецификации исключений функции обнаруживаются только во времявыполнения.

Компилятор не сообщает об ошибке, если в выражении throw возбуждаетсяисключение неуказанного типа. Если такое выражение никогда не выполнится или невозбудит исключения, нарушающего спецификацию, то программа будет работать, как иextern void doit( int, int ) throw(string, exceptionType);void action ( int op1, int op2 ) throw(string) {doit( op1, op2 );// ошибки компиляции не будет// ...ожидалось, и нарушение никак не проявится:}doit() может возбудить исключение типа exceptionType, которое не разрешеноспецификацией action(). Однако функция компилируется успешно.

Компилятор приэтом генерирует код, гарантирующий, что при возбуждении исключения, нарушающегоспецификацию, будет вызвана библиотечная функция unexpected().Пустая спецификация показывает, что функция не возбуждает никаких исключений:extern void no_problem () throw();Если же в объявлении функции спецификация исключений отсутствует, то может бытьвозбуждено исключение любого типа.Между типом возбужденного исключения и типом исключения, указанного вint convert( int parm ) throw(string){//...if ( somethingRather )// ошибка программы:// convert() не допускает исключения типа const char*throw "help!";спецификации, не разрешается проводить никаких преобразований:}538С++ для начинающихВыражение throw в функции convert() возбуждает исключение типа строки символов встиле языка C.

Созданный объект-исключение имеет тип const char*. Обычновыражение типа const char* можно привести к типу string. Однако спецификация недопускает преобразования типов, поэтому если convert() возбуждает такое исключение,то вызывается unexpected(). Для исправления ошибки выражение throw можномодифицировать так, чтобы оно явно преобразовывало значение выражения в типstring:throw string( "help!" );11.4.1. Спецификации исключений и указатели на функцииСпецификацию исключений можно задавать и при объявлении указателя на функцию.Например:void (*pf)( int ) throw(string);В этом объявлении говорится, что pf указывает на функцию, которая способнавозбуждать только исключения типа string.

Как и для объявлений функций,спецификации исключений в разных объявлениях одного и того же указателя неextern void (*pf) ( int ) throw(string);// ошибка: отсутствует спецификация исключениясуммируются, они должны быть одинаковыми:void (*pf)( int );При работе с указателем на функцию со спецификацией исключений есть ограничения натип указателя, используемого в качестве инициализатора или стоящего в правой частиприсваивания. Спецификации исключений обоих указателей не обязаны бытьидентичными. Однако на указатель-инициализатор она должна накладывать столь жеили более строгие ограничения, чем на инициализируемый указатель (или тот, которомуvoid recoup( int, int ) throw(exceptionType);void no_problem() throw();void doit( int, int ) throw(string, exceptionType);// правильно: ограничения, накладываемые на спецификации// исключений recoup() и pf1, одинаковыvoid (*pf1)( int, int ) throw(exceptionType) = &recoup;// правильно: ограничения, накладываемые на спецификацию исключенийno_problem(), более строгие,// чем для pf2void (*pf2)( ) throw(string) = &no_problem;// ошибка: ограничения, накладываемые на спецификацию// исключений doit(), менее строгие, чем для pf3//присваивается значение).

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

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

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

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