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

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

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

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

В главе 12 мы покажем, как ихиспользовать.520С++ для начинающих5211111. Обработка исключенийОбработка исключений – это механизм, позволяющий двум независимо разработаннымпрограммным компонентам взаимодействовать в аномальной ситуации, называемойисключением. В этой главе мы расскажем, как генерировать, или возбуждать, исключениев том месте программы, где имеет место аномалия. Затем мы покажем, как связатьcatch-обработчик исключений с множеством инструкций программы, используя tryблок. Потом речь пойдет о спецификации исключений – механизме, с помощью которогоможно связать список исключений с объявлением функции, и функция не сможетвозбудить никаких других исключений. Закончится эта глава обсуждением решений,принимаемых при проектировании программы, в которой используются исключения.11.1. Возбуждение исключенияИсключение – это аномальное поведение во время выполнения, которое программа можетобнаружить, например: деление на 0, выход за границы массива или истощениесвободной памяти.

Такие исключения нарушают нормальный ход работы программы, ина них нужно немедленно отреагировать. В C++ имеются встроенные средства для ихвозбуждения и обработки. С помощью этих средств активизируется механизм,позволяющий двум несвязанным (или независимо разработанным) фрагментампрограммы обмениваться информацией об исключении.Когда встречается аномальная ситуация, та часть программы, которая ее обнаружила,может сгенерировать, или возбудить, исключение. Чтобы понять, как это происходит,реализуем по-новому класс iStack, представленный в разделе 4.15, используяисключения для извещения об ошибках при работе со стеком. Определение класса iStack#include <vector>class iStack {public:iStack( int capacity ): _stack( capacity ), _top( 0 ) { }bool pop( int &top_value );bool push( int value );bool full();bool empty();void display();int size();private:int _top;vector< int > _stack;выглядит следующим образом:};С++ для начинающихСтек реализован на основе вектора из элементов типа int.

При создании объекта классаiStack его конструктор создает вектор из int, размер которого (максимальное числоэлементов, хранящихся в стеке) задается с помощью начального значения. Например,следующая инструкция создает объект myStack, который способен содержать не более 20элементов типа int:iStack myStack(20);При манипуляциях с объектом myStack могут возникнуть две ошибки:•запрашивается операция pop(), но стек пуст;•запрашивается операция push(), но стек полон.Вызвавшую функцию нужно уведомить об этих ошибках посредством исключений.

Счего же начать?Во-первых, мы должны определить, какие именно исключения могут быть возбуждены. ВC++ они чаще всего реализуются с помощью классов. Хотя в полном объеме классыбудут представлены в главе 13, мы все же определим здесь два из них, чтобыиспользовать их как исключения для класса iStack. Эти определения мы поместим в// stackExcp.hclass popOnEmpty { /* ... */ };заголовочный файл stackExcp.h:class pushOnFull { /* ... */ };В главе 19 исключения в виде классов обсуждаются более подробно, там жерассматривается иерархия таких классов, предоставляемая стандартной библиотекойC++.Затем надо изменить определения функций-членов pop() и push() так, чтобы онивозбуждали эти исключения. Для этого предназначена инструкция throw, которая вомногих отношениях напоминает return.

Она состоит из ключевого слова throw, закоторым следует выражение того же типа, что и тип возбуждаемого исключения. Как// увы, это не совсем правильновыглядит инструкция throw для функции pop()? Попробуем такой вариант:throw popOnEmpty;К сожалению, так нельзя. Исключение – это объект, и функция pop() должнагенерировать объект класса соответствующего типа.

Выражение в инструкции throw неможет быть просто типом. Для создания нужного объекта необходимо вызвать// инструкция является вызовом конструктораконструктор класса. Инструкция throw для функции pop() будет выглядеть так:throw popOnEmpty();Эта инструкция создает объект исключения типа popOnEmpty.522С++ для начинающихНапомним, что функции-члены pop() и push() были определены как возвращающиезначение типа bool: true означало, что операция завершилась успешно, а false – чтопроизошла ошибка.

Поскольку теперь для извещения о неудаче pop() и push()используют исключения, возвращать значение необязательно. Поэтому мы будем считать,class iStack {public:// ...// больше не возвращают значенияvoid pop( int &value );void push( int value );private:// ...что эти функции-члены имеют тип void:};Теперь функции, пользующиеся нашим классом iStack, будут предполагать, что всехорошо, если только не возбуждено исключение; им больше не надо проверятьвозвращенное значение, чтобы узнать, как завершилась операция. В двух следующихразделах мы покажем, как определить функцию для обработки исключений, а сейчас#include "stackExcp.h"void iStack::pop( int &top_value ){if ( empty() )throw popOnEmpty();top_value = _stack[ --_top ];cout << "iStack::pop(): " << top_value << endl;}void iStack::push( int value ){cout << "iStack::push( " << value << " )\n";if ( full() )throw pushOnFull( value );_stack[ _top++ ] = value;представим новые реализации функций-членов pop() и push() класса iStack:}Хотя исключения чаще всего представляют собой объекты типа класса, инструкцияthrow может генерировать объекты любого типа.

Например, функция mathFunc() вследующем примере возбуждает исключение в виде объекта-перечисления . Этокорректный код C++:523С++ для начинающихenum EHstate { noErr, zeroOp, negativeOp, severeError };int mathFunc( int i ) {if ( i == 0 )throw zeroOp; // исключение в виде объекта-перечисления// в противном случае продолжается нормальная обработка}Упражнение 11.1Какие из приведенных инструкций throw ошибочны? Почему? Для правильных(a) class exceptionType { };throw exceptionType();(b) int excpObj;throw excpObj;(c) enum mathErr { overflow, underflow, zeroDivide };throw mathErr zeroDivide();(d) int *pi = excpObj;инструкций укажите тип возбужденного исключения:throw pi;Упражнение 11.2У класса IntArray, определенного в разделе 2.3, имеется функция-операторoperator[](), в которой используется assert() для извещения о том, что индекс вышелза пределы массива.

Измените определение этого оператора так, чтобы в подобнойситуации он генерировал исключение. Определите класс, который будет употреблятьсякак тип возбужденного исключения.11.2. try-блокВ нашей программе тестируется определенный в предыдущем разделе класс iStack иего функции-члены pop() и push(). Выполняется 50 итераций цикла for. На каждойитерации в стек помещается значение, кратное 3: 3, 6, 9 и т.д.

Если значение кратно 4 (4,8, 12...), то выводится текущее содержимое стека, а если кратно 10 (10, 20, 30...), то свершины снимается один элемент, после чего содержимое стека выводится снова. Какнужно изменить функцию main(), чтобы она обрабатывала исключения, возбуждаемыефункциями-членами класса iStack?524С++ для начинающих#include <iostream>#include "iStack.h"int main() {iStack stack( 32 );stack.display();for ( int ix = 1; ix < 51; ++ix ){if ( ix % 3 == 0 )stack.push( ix );if ( ix % 4 == 0 )stack.display();if ( ix % 10 == 0 ) {int dummy;stack.pop( dummy );stack.display();}}return 0;}Инструкции, которые могут возбуждать исключения, должны быть заключены в try-блок.Такой блок начинается с ключевого слова try, за которым идет последовательностьинструкций, заключенная в фигурные скобки, а после этого – список обработчиков,называемых catch-предложениями.

Try-блок группирует инструкции программы иассоциирует с ними обработчики исключений. Куда нужно поместить try-блоки вfor ( int ix = 1; ix < 51; ++ix ) {try {// try-блок для исключений pushOnFullif ( ix % 3 == 0 )stack.push( ix );}catch ( pusOnFull ) { ... }if ( ix % 4 == 0 )stack.display();try {// try-блок для исключений popOnEmptyif ( ix % 10 == 0 ) {int dummy;stack.pop( dummy );stack.display();}}catch ( popOnEmpty ) { ... }функции main(), чтобы были обработаны исключения popOnEmpty и pushOnFull?}В таком виде программа выполняется корректно. Однако обработка исключений в нейперемежается с кодом, использующимся при нормальных обстоятельствах, а такаяорганизация несовершенна. В конце концов, исключения – это аномальные ситуации,возникающие только в особых случаях.

Желательно отделить код для обработки525С++ для начинающиханомалий от кода, реализующего операции со стеком. Мы полагаем, что показанная нижеtry {for ( int ix = 1; ix < 51; ++ix ){if ( ix % 3 == 0 )stack.push( ix );if ( ix % 4 == 0 )stack.display();if ( ix % 10 == 0 ) {int dummy;stack.pop( dummy );stack.display();}}}catch ( pushOnFull ) { ... }схема облегчает чтение и сопровождение программы:catch ( popOnEmpty ) { ... }С try-блоком ассоциированы два catch-предложения, которые могут обработатьисключения pushOnFull и popOnEmpty, возбуждаемые функциями-членами push() иpop() внутри этого блока.

Каждый catch-обработчик определяет тип “своего”исключения. Код для обработки исключения помещается внутрь составной инструкции(между фигурными скобками), которая является частью catch-обработчика. (Подробнееcatch-предложения мы рассмотрим в следующем разделе.)Исполнение программы может пойти по одному из следующих путей:•если исключение не возбуждено, то выполняется код внутри try-блока, аассоциированные с ним обработчики игнорируются.

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

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

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

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