cpp-oop (823968), страница 19

Файл №823968 cpp-oop (Методические пособия по C++ Г.С.Иванова 3 части) 19 страницаcpp-oop (823968) страница 192021-07-27СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Первый – для генерации исключения, а два других – дляорганизации его перехвата.Генерация исключений выполняется в том месте программы, где обнаруживаетсяисключительная ситуация.Оператор throw имеет следующий синтаксис:throw [<Тип>](<Аргументы>);где <Тип> – тип (чаще класс) генерируемого значения; если тип не указан, то компиляторопределяет его исходя из типа аргумента (обычно это один из встроенныхтипов);<Аргументы> – одно или несколько выражений, значения которых будутиспользованы для инициализации генерируемого объекта.Например:1) throw ("Неверный параметр"); /* генерирует исключение типаОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»145const char * с указанным в кавычках значением */2) throw (221);/* генерирует исключение типа const intс указанным значением */3) class E {//класс исключенияpublic: int num;// номер исключенияE(int n): num(n){}// конструктор класса}…throw E(5); // генерирует исключение в виде объекта класса EПерехват и обработка исключений осуществляются с помощью конструкции try …catch …(catch…):try {<Защищенный код>}catch (<Ссылка на тип>){<Обработка исключений>}Блок операторов try содержит операторы, при выполнении которых могутвозникнуть исключительные ситуации.

Блоков catch может быть несколько. Каждыйблок catch включает операторы, которые должны быть активизированы, если привыполнении операторов блока try было зафиксировано исключение типа, совместимого суказанным в catch. При этом:• исключение типа T будет перехватываться обработчиками типов T, const T, T&или const T&;• обработчики типа общедоступного базового класса перехватывают исключениятипа производных классов;• обработчики типа void* перехватывают все исключения типа указателя.Блок catch, для которого в качестве типа указано «…» обрабатывает исключениявсех типов.Например:ОглавлениеИванова Г.С., Ничушкина Т.Н.

«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»146try {<Операторы>} // выполняемый фрагмент программыcatch (EConvert& A){<Операторы>} /* перехватывает исключениятипа EConvert */catch (char* Mes){<Операторы>}//перехватывает исключения типа char*//перехватывает остальные исключенияcatch(…) {<Операторы>}Таким образом, обработчик может перехватывать исключения нескольких типов.При этом существенным оказывается порядок объявления обработчиков исключений.Так, обработчик типа void* не должен указываться перед обработчиком типаchar*, потому что при таком порядке все исключения типа char* будут обрабатыватьсяобработчиком void*.

То же самое касается недопустимости указания обработчикаисключений базового класса перед обработчиками производных классов.Например:class E{};class EA:public E{};…try {…}catch (E& e) {…}// этот обработчик перехватит все исключенияcatch (EA& e){...}// этот обработчик никогда не будет вызванИногда оказывается, что перехваченное исключение не может быть обработано вданном месте программы. В этом случае в обработчик включается оператор throw безпараметра, в результате исключение генерируется повторно с тем же объектом, что ипервый раз.

При обработке этого исключения возобновляется просмотр стека вызовов вцелях обнаружения другого обработчика данного или совместимого типа.Пример 7.1. Создание класса исключения. Многократный перехват исключений.#include <stdlib.h>#include <iostream>using namespace std;class E{};// класс исключенияvoid somefunc(bool ccc) // функция, генерирующая исключение{ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»147if(ccc) throw E();}void func(){try{somefunc(true);}catch(E& e) // первый обработчик исключения{/*если здесь исключение обработать нельзя, то возобновляем его*/if (true) throw;}}voidmain(){try{ func();}catch(E& e) // второй обработчик исключений{// здесь обрабатываем исключениеcout<<"Exception"<<endl;}system("pause");}Стек вызовов для данного примера показан на рис.

7.1.УказательстекаАдрес возврата в функцию somefunc()Адрес возврата в функцию func()Адрес возврата в функцию main()Направление просмотра стекаРис. 7.1. Содердимое стека вызовов в момент генерации исключенияФункция somefunc() генерирует исключение. Для его обработки осуществляетсяобратный просмотр стека вызовов, т. е. по очереди проверяются все функции, выполнениекоторых не завершено. При этом обнаруживается, что вызов sumefunc() осуществлен взащищенном конструкцией try блоке функции func(), и, следовательно, проверяетсяОглавлениеИванова Г.С., Ничушкина Т.Н.

«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»148соответствие типа исключения типу имеющегося обработчика. Тип соответствует,следовательно, исключение перехвачено, но, если оно не может быть обработано в данномобработчике, то исключение будет инициировано вновь. Теперь в поисках обработчикаисключения будет проверяться следующая незавершенная функция – main(). В этойфункции обнаруживается, что вызов func() выполнялся в защищенном блоке.

Припроверкесвязанногосним блокаcatchвыясняется,чтоданноеисключениеперехватывается и обрабатывается.Использование имени переменной в качестве параметра оператора catch позволяетоператорам обработки получить доступ к аргументам исключения через указанное имя.Например:class E//класс исключения{// номер исключенияpublic: int num;E(int n): num(n){}// конструктор}…throw E(5);// генерируемое исключение…catch (E& e)// перехват исключения E{if (e.num==5) // получен доступ к полю{…}}Полностью последовательность обработки исключения выглядит следующимобразом:1) при генерации исключения происходит конструирование временного объектаисключения;2) выполняется поиск обработчика исключения;3) при нахождении обработчика создается копия объекта исключения с указаннымименем;4) уничтожается временный объект исключения;ОглавлениеИванова Г.С., Ничушкина Т.Н.

«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»1495) выполняется обработка исключения;6) уничтожается копия исключения с указанным именем.Поскольку обработчику передается копия объекта исключения, желательно в классеисключения со сложной структурой предусмотреть копирующий конструктор идеструктор.Иногда бывает удобно указать при объявлении функции, какие исключения онаможет генерировать. Именно для этих исключений программист будет предусматриватьобработчики при вызове функции.

Указание генерируемых исключений осуществляется вс п е ц и ф и к а ц и и и с к л ю ч е н и й:throw(<Тип>, <Тип>…)Например:void func () throw(char*,int){…} /*данная функция может генерироватьисключения типов char* и int */При организации перекрытия виртуальных методов следует учитывать, чтоспецификация исключений не считается частью типа функции и, следовательно, ее можноизменить:class ALPHA{public:struct ALPHA_ERR {};virtual void vfunc()throw (ALPHA_ERR) {} // спецификация исключения};class BETA : public ALPHA{public:void vfunc() throw(char *) {} // изменение спецификации};ОглавлениеИванова Г.С., Ничушкина Т.Н.

«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»150Если в процессе выполнения программы будет сгенерировано исключение непредусмотренного спецификацией типа, то управление будет передано специальномуобработчику непредусмотренных исключений. Для определения этой функции впрограмме используется функция set_unexpected():void my_unexpected(){<Обработка исключений> }…set_unexpected(my_unexpected);Функция set_unexpected() возвращает ранее используемый адрес функции –обработчика непредусмотренных исключений, что позволяет организовать достаточносложную обработку.Если нужный обработчик при обратном просмотре стека вызовов не найден, аобработчик непредусмотренных исключений отсутствует, то вызывается функцияавтоматически создаваемая функция terminate().

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

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

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

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