68960

Генерація виняткових ситуації

Лекция

Информатика, кибернетика и программирование

Якщо виникає необхідність повторно порушити виняткову ситуацію усередині її обробника, можна виконати оператора throw, не указуючи тип виняткової ситуації. В цьому випадку операторові try/catch передається поточна виняткова ситуація. Таким чином для однієї і тієї ж виняткової ситуації...

Украинкский

2014-09-28

56 KB

0 чел.

Лекція № 22

Тема: Генерація виняткових ситуації

План

  1.  Повторне генерування виняткової ситуації
  2.  Функції terminate() і unexpected()
  3.  Обробники, пов'язані з функціями terminate() і unexpected()
  4.  Класи exception і bad_exception

Повторне генерування виняткової ситуації

Якщо виникає необхідність повторно порушити виняткову ситуацію усередині її обробника, можна виконати оператора throw, не указуючи тип виняткової ситуації. В цьому випадку операторові try/catch передається поточна виняткова ситуація. Таким чином для однієї і тієї ж виняткової ситуації можна передбачити декілька обробників. Допустимо, один обробник виняткової ситуації управляє одним аспектом, а другий — останніми. Усередині блоку catch (або функції, що викликається з цього блоку) можна лише повторно згенерувати виняткову ситуацію. В цьому випадку вона передається не тому ж самому операторові catch, а наступному. Повторне генерування виняткової ситуації ілюструється наступною програмою.

 

// Приклад повторного генерування виняткової ситуації.

#include <iostream>

using namespace std;

void Xhandler()

{

try {

throw "Привіт"; // Генерується об'єкт типу char *

} catch(const char *){ // Перехоплення об'єкту типу char *

cout « "Перехоплення об'єкту типу char * усередині функції

Xhandler\n";

throw ; // Повторне генерування об'єкту типу char *

// поза функцією.

}

}

int main() {

cout « "Початок\ п";

try {

Xhandler() ;

} catch(const char *) {

cout << "Перехоплення об'єкту типу char * у функції main\n";

}

cout « "Кінець";

return 0;

}

Результати роботи цієї програми наводяться нижче.

Початок

Перехоплення об'єкту типу char * усередині функції Xhandler()

Перехоплення об'єкту типу char * усередині функції main()

Кінець

Функції terminate() і unexpected()

Як указувалося раніше, функції terminate () і unexpected() викликаються в крайніх випадках, тобто коли обробка виняткової ситуації виконується невірно. Ці функції належать стандартній бібліотеці мови C++. Їх прототипи показані нижче.

void terminate ()

void unexpected()

Для виклику цих функцій необхідний заголовок <exception>.

Функція terminate () викликається, якщо підсистема обробки виняткових ситуацій не може виявити відповідного оператора catch. Крім того, вона викликається, якщо програма намагається повторно згенерувати виняткову ситуацію, яка раніше ніколи не генерувалася. Функція terminate() викликається також в багато інших, заплутаніших ситуаціях. Наприклад, деструкція знищуваного об'єкту генерує виняткову ситуацію в процесі розкручування стека, який виконується при генеруванні іншої виняткової ситуації. Як правило, функція terminate() є останнім засобом обробки виняткової ситуації, якщо ніякою інший обробник не підходить. За умовчанням функція terminate() викликає функцію abort().

Функція unexpected() викликається при спробі генерувати виняткову ситуацію, не вказану в розділі throw. За умовчанням функція unexpected() викликає функцію terminate().

Обробники, пов'язані з функціями terminate() і unexpected()

Функції terminate() і unexpected() просто викликають інші функції, які насправді обробляють помилку. Як показано вище, за умовчанням функція terminate() викликає функцію abort(), а функція unexpected() — функцію terminate(). Таким чином, за умовчанням при виникненні виняткової ситуації обидві функції переривають виконання програми. Проте функції terminate() і unexpected() можуть викликати інші функції. Це дозволяє програмі повністю контролювати підсистему обробки виняткових ситуацій.

Щоб змінити обробник, пов'язаний з функцією terminate (), слід викликати функцію set_terminate (), як показано нижче.

terminate_handler set_terminate (terminate_handler newhandler) throwО;

Тут параметр newhandler є покажчиком на новий обробник, пов'язаний з функцією terminate (). Ця функція повертає покажчик на старий обробник, пов'язаний з функцією terminate(). Новий обробник повинен мати тип terminate_handler, визначений за допомогою наступного оператора:

typedef void (*terminate_handler) ();

Єдине призначення обробника terminate_handler — припинити виконання програми. Він не повинен повертати управління або відновлювати виконання програми.

Щоб змінити обробник, пов'язаний з функцією unexpected (), слід викликати функцію set_unexpected(), як показано нижче.

unexpected_handler set_unexpected(unexpected_handler newhandler) throw();

Тут параметр newhandler є покажчиком на новий обробник, пов'язаний з функцією unexpected(). Ця функція повертає покажчик на старий обробник, пов'язаний з функцією unexpected(). Новий обробник повинен мати тип unexpected_handler, визначений за допомогою наступного оператора:

typedef void (*unexpected_handler)();

Цей обробник може сам генерувати виняткові ситуації, припиняти виконання програми або викликати функцію terminate(). Проте він не повинен повертати управління програмі.

Для виклику функцій set_terminate() і set_unexpected() необхідний заголовок  <expection>.

Розглянемо приклад, в якому визначається обробник, пов'язаний з функцією terminate().

// Визначення нового обробника,

//связанного з функцією terminate.

#include <iostream>

#include <cstdlib>

#include <exception>

using namespace std;

void my_Thandler() {

cout << "Усередині нового обрабочика\ п";

abort();

}

int main() {

// Визначення нового обробника,

// пов'язаного з функцією terminate. set_terminate(my_Thandler);

try {

cout « "Усередині блоку try\n";

throw 100; // Генерування помилки.

} catch (double i) {

// He перехоплює виняткові ситуації типу int.

// ...

}

return 0;

}

Результати цієї програми приведені нижче.

Усередині блоку try

Усередині нового обробника

abnormal program termination

 

Функція uncaught_exception()

Підсистема обробки виняткових ситуацій в мові C++ містить ще одну функцію — uncaught_exception(). Її прототип показаний нижче.

bool uncaught_exception();

Ця функція повертає значення true, якщо виняткова ситуація згенерувала, але ще не перехоплена. Якщо виняткова ситуація була перехоплена, функція повертає значення false.

Класи exception і bad_exception

Функції із стандартної бібліотеки мови C++ можуть генерувати виняткові ситуації, похідні від класу exception. Крім того, обробник, пов'язаний з функцією unexpectedO, може генерувати виняткову ситуацію bad_exception. Для використання цих класів потрібний заголовок <exception>.

Застосування обробки виняткових ситуацій

Система обробки виняткових ситуацій дозволяє реагувати на незвичайні події, що виникають в ході виконання програми. Отже, обробники виняткових ситуацій повинні виконувати якісь розумні дії, які дозволяють виправити помилку або пом'якшити її наслідки. Розглянемо як приклад наступну просту програму. Вона вводить два числа і ділить перше з них на друге. Для запобігання діленню на нуль застосовується обробка виняткової ситуації.

#include <iostream>

using namespace std;

void divide(double а, double b);

int main() {

double i, j;

do {

cout << "Введіть чисельник (6 означає вихід): ";

cin >> i;

cout << "Введіть знаменник: ";

cin >> j;

divide(i, j);

} while(i != 0);

return 0;

}

void divide(double а, double b){

try {

if(!b) throw b; // Перевірка ділення на нуль

cout « "Результат: " << a/b « endl;

} catch (double b) {

cout « "Ділити на нуль не можна.\ n";

}

Цей дуже простій приклад ілюструє принцип обробки виняткових ситуацій. Якщо знаменник рівний нулю, виникає виняткова ситуація. Її обробник не передбачає ділення (це привело б до аварійного завершення роботи програми), а просто повідомляє користувача про виниклу помилку. Таким чином, ділення на нуль можна уникнути, продовживши виконання програми. Ця схема працює і в складніших випадках.

Обробка виняткової ситуації особливо корисна при виході з глибоко вкладених процедур, в яких виникла катастрофічна помилка. Мова C++ надає досконаліші засоби для вирішення цієї проблеми, чим мова C, в якому застосовувалися функції setjmp() і longjmp (). Пам'ятайте, що обробка виняткових ситуацій призначена для забезпечення розумної реакції на виникаючі помилки. Отже, ситуація повинна бути простою і очевидною, наскільки це можливо.


 

А также другие работы, которые могут Вас заинтересовать

33531. Несвоевременные мысли» М.Горького как опыт национальной самокритики 20.06 KB
  Советское литературоведение отталкиваясь от определения Ленина Горький не политик толковало публицистику как отступление от правды большевизма. Это хорошо понимал и сам Горький. Горький подозревает крестьянство в тяжких грехах и противопоставляет ему рабочий класс напутствуя: Не забывайте что вы живете в стране где 85 населения крестьяне и что вы среди них маленький островок среди океана. На крестьянство Горький не рассчитывает потому что оно жадное до собственности получит землю и отвернется изорвав на онучи знамя Желябова.
33532. Тема любви в лирике В.Маяковского и лирике С.Есенина 20-х гг. 21.61 KB
  Октябрьская революция раскрепостив человека создала условия для торжества любви любви как счастья как радости. Это произведение о человеческой любви во всех ее проявлениях о любви в самом широком смысле этого слова. Утверждая право человека ненавидеть во имя любви Маяковский по ходу эволюции своего лирического героя показывает как его чувства становятся социально осмысленными.
33533. Отражение истории в судьбе Г.Мелехова (по роману М.Шолохова «Тихий Дон») 14.64 KB
  Григорий Мелехов это главный герой романа. На войне герой возмужал заслужил четыре георгиевских креста и четыре медали стал офицером поддержал казачью честь и славу но стал злым. После знакомства с большевистской философией герой чувствует себя зрячим. Трех коней убили под Григорием в пяти местах продырявлена его шинель но геройство оказывается напрасным поток Красной армии затопляет Донскую землю.
33534. Проблематика и жанровые особенности романа М.Шолохова «Тихий Дон» 16.39 KB
  Действительно Шолохов в отличие от автора âВойны и мираâ не дает в романе теоретического обоснования своей исторической концепции несмотря на то что его трактовка исторических событий нередко отличается от главенствовавшей тогда в исторической науке. В своем романе Шолохов рисует жизнь русского донского казачества. В этом романе Шолохов освещает проблемы связанные с войной и революцией начала 20 века. Но есть в романе и другое.
33535. Политическая лирика В.Маяковского 18.44 KB
  Февральская и Октябрьская революции явились для Маяковского началом реального воплощения его идей о новом свободном человеке и счастливом мироустройстве. Отныне романтический индивидуализм присущий лирическому герою Маяковского уступил место соборности единению с миллионами я сменилось на мы конфликт личности и общества был снят самой историей. Футуристическая эстетика Маяковского сменилась доктриной коммунистического футуризма и Левого фронта искусств с его идеями искусства как жизнестроения. Знаменитые Окна РОСТА регулярно...
33536. Идейно-тематические особенности рассказов М.Зощенко. Герои, конфликты 15.7 KB
  Несмотря на то что герой не считает себя удачливым в жизни так как выходит ему время от времени перетык и прискорбный случай он философствует Жизнь штука не простая а сложная имеет на все свои взгляды: и на мужицкую жизнь блекота и слабое развитие техники и на культуру иностранную которую он знает. Я всегда стремился к изображению положительных сторон жизни. которые проповедовали свободу искусства от политики изображали действительность исходя из фактов жизни быта. Главным фактом в то время была революция которую...
33537. Повесть В.Распутина «Прощание с Матерой» как итоговое произведение «деревенской» прозы 17.11 KB
  Жанр повести можно определить как философскую притчу. Таким образом один из основных философских смыслов повести заключается в том что не нами начинается жизнь на земле и не нашим уходом заканчивается. В повести двадцать две главы в которых воспроизводится быт жителей Матеры в последние три месяца их пребывания на острове. Трагическая развязка повести проявляет авторскую позицию.
33538. «Матренин двор» А. Солженицына как начало второго этапа развития «деревенской прозы. Особенности этого этапа 17.23 KB
  Хозяйка дома Матрена одинокая женщина лет шестидесяти. Матрена Васильевна избу не жалела ни для мышей ни для тараканов ибо в шуршании мышей непрерывном как далекий шум океана шорохе тараканов не было ничего злого не было лжи. Матрена отличалась трудолюбием: вставала в четырепять утра тихо вежливо стараясь не шуршать топила русскую печь ходила доить козу по воду ходила и варила в трех судочках . Матрена никому не могла отказать: без нее ни одна пахота не обходилась.
33539. Основные конфликты «деревенской» прозы 50-х гг 15.2 KB
  Деревенская проза ведет свое начало с 50х годов. Очеркистыдеревенщики 50 60х годов не позволяли себе сомневаться в необходимости колхозов не поднимали руку на то как осуществлялось партийное руководство ими но показывали сколько вреда наносят бездумные директивы галочная система. 50е ГОДЫ овечкинский этап МОМЕНТ ПРОЗРЕНИЯ после лакировочнобесконфликтного наваждения 40х годов. Овечкинское направление в литературе 50х годов было: резкой реакцией на литературную мифологию 40х годов; возвращением деревенской прозы...