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 (). Пам'ятайте, що обробка виняткових ситуацій призначена для забезпечення розумної реакції на виникаючі помилки. Отже, ситуація повинна бути простою і очевидною, наскільки це можливо.


 

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

29595. Медиапланирование 12.03 KB
  Медианоситель – конкретный представитель медиаканала где размещается рекламное сообщение. Медианоситель отбирается по качественным и количественным показателям. Медиамикс – размещение рекламных материалов сразу в нескольких СМИ и как правило под типовым набором смеси из СМИ медиамикс понимается комбинация ТВ Радио Пресса Наружка. Долю охваченной и неохваченной аудитории при медиамиксе вычисляем формулам теории вероятности: 1Pb = 1P 1Pb где Pb охваченная медиамиксом аудитория P – аудитория охваченная первым медиа Pb...
29596. Технологии нейро-лингвистического программирования (НЛП) 20.25 KB
  Технологии нейролингвистического программирования НЛП Изначально задумывалась как технология совершенствования личности. 5 моделей жизненных стратегий: иметь действовать знать относится к какомуто классу обществу – принадлежать к быть кемто Техники НЛП: Мозг лучше справляется с позитивными целями негативные: не упади не пролей не проходите мимо Ярка творческая визуализации поставленной цели визуально запах звук Принцип уподобления – приобщиться к карте реальности достичь целей как какойто человек которым...
29597. Психология памяти в медиапланировании. Исследования памяти в рекламе 15.49 KB
  При поступлении новых элементовстарые вытесняются последниезапоминаютсяэффект давности Во и Норман: Первичная система кратковременного хранения обладающая ограниченным объемом где инфо теряется за счет вытеснения старых элементов. Виды хранения: Акустическая Сенсорноеосуществление на этапе без участия сознания фотографичинфо сохраняется с фотографической точностью и не поддается контролю со стороны субъекта. 2 Для долговремен памяти характерно обращение к прошлому опыту поиска там инфо необходимой для понимания настоящего....
29598. Возникновение коммуникации. Социально-экономические факторы развития коммуникации 14.74 KB
  Возникновение коммуникации. Социальноэкономические факторы развития коммуникации. Выделяют два подхода к коммуникации: механистический однонаправленный процесс кодирования и передачи информации от источника и приема информации и получателем сообщения и деятельностныйсовместная деятельность участников коммуникации в ходе которой вырабатывается общий взгляд на вещи и действия с ними. Целями коммуникации являются: обмен и передача информации; формирование умений и навыков развитие профессиональных качеств; формирование отношения к себе к...
29599. Схема и сущность коммуникативного процесса. Виды шумов в коммуникации 44.59 KB
  Схемы Большое распространение получила линейная модель коммуникации разработанная Лассуэлом и включающая 5 элементов: Кто передает сообщение – коммуникатор Что передается сообщение Как осуществляется передача канал Кому направлено сообщение аудитория С каким эффектом эффективность Р. К функциональным элементам относятся: источник информации продуцирующий сообщение; отправитель кодирующий сообщение в сигналы; канал проводящий это сообщение; получатель; цель или место назначения. Преимущество данной схемы состоит в...
29600. Виды и уровни коммуникации. Особенности массовой коммуникации 17.78 KB
  декодирование кодированиеобратная связь и тп особенности публичный характер открытость ограниченный и контролируемый доступ к средствам передачи опосредованность контактов множество реципиентов влияние институциональных предписаний особенности смк рассредоточение в пространстве многоконачльность СМК делятся на СМИ слухи и наружную рекламу 1. Слухи оказывают большое влияние на формирование общественного мнения благодаря обсуждению в малых приватных группах без освещения в СМИ. СМИ являются основным видом массовых...
29601. Массовая коммуникация в современном обществе: функциональный подход 15.29 KB
  Если это осуществляется в деятельности СМИ то таким образом ими реализуется важнейшая социальная функция интеграционная.фии МК: 1 обозрение окружающего мира: медиа расширяют горизонты познания индивида информационная функция; 2 корреляция с социальной структурой и ответственностью общества воздействие на него и его познание через обратную связь корреляционная функция проявляющаяся также в объяснении и интерпретации информационных сообщений в обеспечении поддержки существующим властям и господствующим нормам; 3 трансмиссия...
29602. Массовая коммуникация в современном обществе 17.28 KB
  Информационная функция: информирование о событиях и условиях жизни в обществе и мире; информационное обеспечение инновационных процессов; II. Функция социальной связи: интерпретация происходящего; поддержка существующих норм и властных отношений; социализация; координация разнонаправленной социальной активности формирование общественного согласия; III. Функция обеспечения преемственности: выражение образцов доминирующей культуры узнавание субкультур новых культурных направлений; поддержание общности социальных ценностей; IV....
29603. Основные теории коммуникации. Основные персоналии в мире теории и социологии массовой коммуникации 17.09 KB
  Основные теории коммуникации. Основные персоналии в мире теории и социологии массовой коммуникации. Коммуникации: по типу отношений: межличностная групповая массовая; по типу использования семиотических средств: речевая паралингвистическая вещественнознаковая. Существование социума невозможно без коммуникации.