Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 51
Текст из файла (страница 51)
Шаблоны и обработка исключительных ситуаций Поскольку исключительная ситуация целого типа не будет перехвачена инструкцией сагсЬ тигга ЙоиЫе, на экран программа выведет следующее: начало Внутри блока ггу АЬпоггпа1 ргоягагп гегпйпаг)оп 3. Исключительная ситуация может быть возбуждена не входящей в блок 1гу инструкцией, если сама эта инструкция входит в функцию, которая вызывается из блока 1гу. Например, ниже представлена совершенно правильная программа: Возбуждение исключительной ситуации из функции, находящейся вне блока ггу Ф/ гг(пс)иг)е <1ояггеал> пя(пя пагпеярасе яМ; уоЫ Хееяс (1пе Геят) соцс « "Внутри функции Хсеяе, Ьеяс равно: « сея' « '~п '; фй (сея ) ЬЬтои Сенс; фпГ. льзфп () соус « "начало~п"т сну начало блока сту соне « "Внутри блока Тту~п"; Хсеяе (0) Г ХСеяс (1); Хгеяс (2); сассЬ (фпя 1) ', /1 перехват ошибки сочв « "перехвачена охгибка номер: соцс « 1 « "~п"г сонг « "конец"; теснтп О; На экран программа выводит следующее: начало Внутри блока Ьту Внутри функции Хееяс, Ьеяс равно: О Втл три функции Хсея , сенс равно: 1 342 Самоучитель С++ Перехвачена ошибка номер: 1 конец 4.
Блок ~гу можно располагать внутри функции. В этом случае при каждом входе в функцию обработчик исключительной ситуации устанавливается снова. Например, рассмотрим следующую программу: ()1пс1цс(е <1оясгеалс> пягпп пашеярасе ЯГС(; // Блоки сту и сассЬ могут находиться не только в функции та1п ( ) чоЫ Хпапс(1ег (гпг сеял) ( сгу 11 (сеяс) сйгои шеяс; ) сагой(ьпг 1) ( соил « "перехвачена ошибка номер: " « 1 « ' ~п ' 1 шш тагп ( ) сопя « "начало'хп"; Хбапа1ег[1)р Хпапс(1ег (2) р ХПапс(1ег (О); Хйапс(1ег(3)) сонг « "конец"; гегнгп О; На экран программа выводит следующее: начало Перехвачена ошибка номер: 1 Перехвачена ошибка номер: 2 Перехвачена ошибка номер: 3 конец Как видите, обработаны три исключительные ситуации.
После вызова каждой исключительной ситуации функция возвращает свое значение. При повторном вызове функции обработчик исключительной ситуации устанавливается вновь. 5. Как упоминалось ранее, с блоком (гу можно связать более одной инструкции са(с)). Как правило, так и делается. При этом каждая инструкция са(с)) пред- Глава ) г. Шаблоны и обработка исключительных ситуаций 343 назначена для перехвата своего типа исключительной ситуации. Например, в следующей программе перехватываются две исключительных ситуации, одна для целых и одна для строки: ()1пс1цг(е <1овсгеагв> цз(пя пагпезрасе згб; // Можно перехватывать разные типы исключительных ситуаций чоЫ Х)тапс(1ек(1пС Севб) ( (гу ( з.Е(бееЦ Г)згов трет; е)ве г)згоъ "Значение равно нулю"; са(с)з ((пт з.) ( соцс « "Перехвачена ошибка номер: " « 1 « ) сабо)г(с)заг *вбг) сонг « "Перехвачена строка: сонг «вгг « 'М*г тлб шатп () соцб « "начало'~п"; Х)запс)1ек(1)т ХЬапс)1ек(2)г Х)гапс)1ек(О)) Х)зап61ек(3) ( сонг « "конец"; ге(цгп О; На экран программа выводит следующее: Как видите, казкдая инструкция са(сЬ перехватывает только исключительные ситуации соответствующего ей типа.
Обычно выражения инструкций сатен проверяются в том порядке, в котором они появляются в программе. Выполняется только та инструкция, которая начало Перехвачена Перехвачена Перехвачена Перехвачена конец ошибка номер: 1 ошибка номер: 2 строка: Значение равно нулю ошибка комер: 3 Самоу воитель С н. совпадает по типу данных с исключительной ситуацией. Все остальные бло- ки са1сй игнорируются. „ВРВФЯВЦмф 1. Лучший способ понять, как функционирует система обработки исключительных ситуаций в С++ — это поработать с ней.
Введите, откомпилируйте и запустите предыдущие примеры программ. Затем поэкспериментируйте с ними, меняя фрагменты и исследуя результаты. 2. Что неправильно в данном фрагменте? ьст ГваГП () ( гайто 12.2З; 3. Что неправильно в данном фрагменте? г ягой ' а // са1сГг (сваг *) 4. Что может произойти при возбуждении исключительной ситуации, для которой не задано соответствующей инструкции са1сп? 1 1.4. Дополнительная информация об обработке исключительных ситуаций В системе обработки исключительных ситуаций имеется несколько дополнительных аспектов и нюансов, которые могут сделать ее понятнее и удоб-- ней для применения. В некоторых случаях необходимо настроить систему так, чтобы перехватывать все исключительные ситуации, независимо от их типа.
Сделать это достаточно просто. Для этого используйте следующую форму инструкции са1сЬ: сессии (...) ( ух обработка всех аскаквгктелвгшх сктуацгог Глава 1 1. Шаблоны и обработка исключительных ситуаций 345 Здесь многоточие соответствует любому типу данных. Для функции, вызываемой из блока 1гу, вы можете ограничить число типов исключительных ситуаций, которые способна возбудить такая функция. Фактически можно даже запретить функции вообще возбуждать какую бы то ни было исключительную ситуацию. Для этого необходимо добавить в определение функции ключевое слово гогов.
Здесь представлена основная форма такого определения: воаврицаенвй тнп нмк 4~увкцнн (список аргументов/ Гйтотж (список внпов) // Здесь в поле список тииоа перечисляются через запятые только те типы данных исключительных ситуаций, которые могут быть возбуждены функцией. Возбуждение любого другого типа исключительной ситуации приведет к аварийному завершению программы. Если вы хотите, чтобы функция не возбуждала никаких исключительных ситуаций, то оставьте поле сиисеи тиииов пустым. Если ваш компилятор работает в соответствии с современным стандартом ЯапдаИ С++. то попытка возбуждения неподдерживаемой исключительной ситуации приведет к вызову стандартной библиотечной функции ппехрес(е(10. По умолчанию функция ппехрес(еоО вызывает функцию а((ог((), что ведет к аварийному завершению программы.
Однако при желании вы можете задать собственную процедуру завершения программы. За подробностями обращайтесь к справочной документации вашего компилятора. Если вы хотите в процедуре обработки исключительной ситуации возбудить повторную исключительную ситуацию, можно просто использовать инструкцию ()(гож без параметров. Это приводит к тому, что текущая исключительная ситуация передается внешней последовательности инструкций (гу/са(сй. :Примеры', 1.
В следующей программе иллюстрируется использование инструкции саГсЬ(.„): В этой программе перехватываются все типы исключительных ситуаций Ипс1цг(е <говьгеагп» пвьпр папеврасе впс1; уогй Хушанг(1ЕГ(спи бевс) лгу ( возбуждение исключительной ситуации гида гпп Ь1(т.еаб=-01 дбгои бевп; 34б Самоучитель Свв О возбуждение исключительной ситуации типа с)тах 1й(хеах- 1) сЬхоы 'а'; возбуждение исключительной ситуации типа с(оц)з1е бй (Хевс= 2) СЬхоы 123.23; са~с)ч (...) ( // перехват исключительных ситуаьд<й всех типов соцс « "перехвачена ошибка)~п"р ) 1п~ шаьп () ( соцс « "начало~п"; Хпапс(1ех(0); Хпапсй1ех(1); ХЬапб1ех(2); соцс « "конец '; хебихп О; На экран программа выводит следующее: начало Перехвачена ошибка ! Перехвачена ошибка ! Перехвачена ошибка ! конец Как видите, во всех трех случаях возбуждения исключительной ситуации в инструкции Йготг, она перехватывается с помощью единственной инструкции са1с)3.
2. Очень удобно инструкцию св1еЬ(...) использовать в качестве последней в группе инструкций са1с)). В этом случае инструкция саблей(...) по умолчанию становится инструкцией, которая "перехватывает все". Например, далее представлена слегка измененная версия предыдущей программы, где исключительные ситуации целого типа перехватываются явно, а все другие — с помощью инструкции еа1сЬ(...): 1* В этом прьлчере инструкция саСси (...) по умолчанию перехватывает все типы исключительных ситуацвв3 */ ((1пс1цбе <ьовххеатп> овяпя патпевраее зебр уо1<( ХЬап61ех(1пе тевт) ( Глава 1 1, Шаблоны и обработка искллзчительных ситуаций Э47 тсу ( возбуждение исключительной ситуации типа тпс 1т'(севс=-О) л)ттои сеял; возбуждение исключительной ситуации типа с)тат тт (севе==1) С)злох 'а'; // возбуждение исключительной ситуации типа боцЫе тт (севс==2) лЬлои 123.23; сасс(з(тпс 1) ( // перехват исключительной ситуации типа тпс сопл « "Перехвачен " « 1 « '~п'; савой (...) ( // перехват исключительных ситуаций остальных типов соцС « "Перехвачена ошибка! ~п"; тпс шатп ( ) соцс « "начало~в" Х)тапг(1ел(О); Х)тапс(1ек(1); Х)тапс)1ет(2); сощ « "конец"; гетцгп О; На экран программа выводит следующее: начало Перехвачен о Перехвачена ошибка! Перехвачена ошибка! конец Как показано в этом примере, использование инструкции са1сй(...) таким образом — это хороший способ перехватывать те исключительные ситуации, которые вы не хотите обрабатывать явно.
Кроме этого, путем перехвата всех исключительных ситуаций вы предотвращаете аварийное завершение программы из-за случайно необработанной исключительной ситуации. 3. В следующей программе показано, как ограничить число типов исключительных ситуаций, которые возбуждаются функцией: /+ Ограничение числа возбуждаеьых функцией типов исключительных ситуаций ж/ (11пс1цде <ьовскеаш> из(пд патпезрасе зЯ; Самоучитель // Этой функцией могут возбуждаться только // исключительные ситуации типов (п(, с)тат и доцЬ)е чоЫ ХЬапб1ег (1пю тент) ГЬгои (ьгГ, сЬаг, доцЫе) ( // возбуждение исключительной ситуации типа 1пс ьг (ГЕВГ =-0) сЬгои севе; возбуждение исключительной ситуации типа сЬаг 1Г(севе==1) сЬгои 'а'; возбуждение исключительной ситуации типа с)оцЬ1е 1г(севГ==2) ЬЬгои 123.23; 1пб патп () соил « "началоХп"; г гу ХЬапс(1ег (0) ) // попробуйте также передать в Функцию ХЬатк)1ег () значения 1 и 2 ) саесЬ (тпе 1) ( сопл « "Перехват 1пг1п") саесЬ (сЬаг с) сопл « "Перехват сЬаг1п"; сагсЬ (боцЬ1е сп сопс « "перехват с)оцЬ1е1п" соцг « "конец"; гегцгп О; В этой программе функция Храп(Пего может возбуждать только исключительные ситуации типа ш1, сваг и допЫе.