67365

Повторне генерування винятку

Лекция

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

Для того, щоби повторно згенерувати винятки в його обробнику, необхідно використовувати throw-настанову без вказання типу винятку. У цьому випадку поточний виняток передається в зовнішню try/catch-послідовність. Найчастіше причиною для такого виконання настанови throw слугує прагнення мати доступ до одного винятку декільком обробникам.

Украинкский

2014-09-07

79.5 KB

0 чел.

Лекція № 25

Тема: Повторне генерування винятку

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

кається з цього блоку). При повторному генеруванні винятку сам виняток не перехоплюватиметься тією ж catch-настановою. Він пошириться на найближчу try/catch-послідовність.

    Повторне генерування винятку типу char * продемонстровано у наведенному нижче коді програми.

Приклад. Демонстрація механізму повторного генерування винятку типу char *

 

void Xhandler()

{

 try

{

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

}

catch(char *)

{     // Перехоплює винятки типу char *

 cout << "Перехоплення винятку у функції Xhandler" << endl;

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

                           // яке перехоплюватиметься поза функцією Xhandler.

}

}

void main()

{

cout << "Початок" << endl;

try

{

 Xhandler();

}

catch(char *)

{

 cout << "Перехоплення винятку у функції main()" << endl;

}

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Початок.

Перехоплення винятку у функції Xhandler.

Перехоплення винятку у функції main().

Кінець програми

Тема: Обробка винятків, згенерованих оператором new

   Як зазначалося вище, оператор new генерує винятки, якщо не вдається задовольнити запит на виділення області пам'яті. Там опис оброблення винятків такого типу було відкладено на потім. Якраз тепер настав час розглянути цю проблему детальніше.

   Спершу необхідно зазначити, що у цьому розділі описано поведінку оператора new відповідно до стандарту мови C++. Проте, дії, які здійснює система при неуспішному використанні оператора new, з моменту появи мови C++ змінювалися вже декілька разів. Спочатку оператор new повертав при невдачі значення NULL. Пізніше така поведінка була замінена генеруванням винятку, ім'я якого також мінялося кілька разів. Нарешті, було вирішено, що оператор new генеруватиме виняток за замовчуванням, але як альтернативний варіант він може повертати і нульовий показник. Отже, оператор new у різний час був реалізований різними способами. І хоча всі сучасні компілятори реалізують оператор new відповідно до стандарту мови C++, компілятори "поважнішого" віку можуть містити відхилення від нього.

   Згідно зі стандартом мови C++, у випадку неможливості задовольнити запит на виділення області пам'яті, потрібної операторові new, генерується виняток типу bad_alloc. Якщо Ваша програма не перехопить його, то вона буде завчасно завершена. Хоча така поведінка виправдана для коротких прикладів програм, в реальних додатках необхідно перехоплювати цей виняток і розумно обробляти його.

   Щоб отримати доступ до винятку типу bad_alloc, потрібно залучити до програми заголовок <new>.

   Розглянемо приклад використання оператора new, поміщеного в try/catch-блок для вистежування невдалих результатів запиту на виділення області пам'яті.

Приклад. Демонстрація механізму оброблення винятків, згенерованих оператором new

int main()

{

int *p;

try

{

 p = new int[32]; // Запит на виділення області пам'яті

 // для 32-елементного int-масиву

}

 catch(bad_alloc ха)

{

 cout << "Пам'ять не виділена" << endl;

 return 1;

}

for(int i=0; i<32; i++) p[i] = i;

for(int i=0; i<32; i++) cout << p[i] << " ";

delete [] p; // Звільнення пам'яті

}

   Під час невдалого виконання оператора new виняток у цьому коді програми буде перехоплено catch-настановою. Цей самий підхід можна використовувати для вистежування будь-яких помилок, взаємопов'язаних з використанням оператора new: достатньо помістити кожну new-настанову в try-блок.

  Альтернативна форма оператора new – nothrow.

   Стандарт мови C++ при невдалій спробі виділення області пам'яті оператором new замість генерування винятку також може повертати значення NULL. Ця форма використання оператора

new особливо корисна у процесі компілювання старих програм із застосуванням сучасного С++-компілятора. Вона також корисна при заміні викликів функції malloc() оператором new. Це звичайна практика у процесі перекладу С-коду програми на мову програмування C++. Отже, формат оператора new має такий вигляд:

p_var = new(nothrow) тип;

   У цьому записі елемент p_var – це покажчик на змінну типу тип. Цей nothrow- формат оператора new працює подібно до оригінальної версії оператора new, яка використовувалася кілька років тому. Оскільки оператор new(nothrow) повертає при невдачі значення NULL, його можна "упровадити" в старий код програми, не вдаючись до оброблення винятків. Проте в нових програмах, написаних мовою C++, все ж таки краще мати справу з генеруванням винятків.

   У наведеному нижче прикладі показано, як використовується альтернативний варіант new(nothrow). Неважко здогадатися, що нижче наведено можливий варіант попереднього коду програми.

Приклад. Демонстрація механізму використання nothrow як старої версії оператора new

int main()

{

int *p;

p = new(nothrow) int[32]; // Використання nothrow-версії

if(!p)

{

 cout << "Пам'ять не виділена" << endl;

 return 1;

}

for(int i=0; i<32; i++) p[i] = i;

for(int i=0; i<32; i++) cout << p[i] << " ";

delete [] p; // Звільнення пам'яті

}

   У цьому коді програми під час використання throw-версії після кожного запиту на виділення області пам'яті необхідно перевіряти значення покажчика, що повертається оператором new.


 

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

29481. Общественные перемены и общественное мнение 23 KB
  Человек политический: сцена и роли переходного периода 9. Человек толпа и масса в общественном мнении 17. Средний человек: фикция или реальность 19. Советский человек пять лет спустя: 19891994 гг.
29482. ОТ МНЕНИЙ К ПОНИМАНИЮ 90 KB
  Москва 2000 ОТ АВТОРА В книге собраны статьи публиковавшиеся в журнале Мониторинг общественного мнения1 с 1993 по 2000 гг. В этой формуле выражен один из основных принципов работы нашего центра: использовать данные изучения общественного мнения для понимания процессов и перемен в социальной экономической политической и культурной жизни общества. ВЕКТОРЫ ПЕРЕМЕН: СОЦИОКУЛЬТУРНЫЕ КООРДИНАТЫ ИЗМЕНЕНИЙ Уровни и предмет анализа в социальном исследовании Результаты массовых опросов общественного мнения как зарубежные так и отечественные чаще...
29483. ОБЩЕСТВЕННОЕ МНЕНИЕ В ГОД КРИЗИСНОГО ПЕРЕЛОМА 64.5 KB
  Дело не просто в падении или росте доверия к отдельным лидерам организациям институтам власти и пр. Первая относится к марту апрелю парламентский кризис попытка импичмента президента референдум как стремление найти выход из парламентского а точнее конституционного тупика при помощи прямого обращения президентской власти к авторитету общественного мнения. Обратная сторона этой медали изменение содержания таких традиционных категорий политической жизни как лидерство доверие поддержка властных структур или оппозиция власти. оказалась...
29484. ФАКТОРЫ И РЕСУРСЫ ОБЩЕСТВЕННОГО МНЕНИЯ В УСЛОВИЯХ «ПОСТМОБИЛИЗАЦИОННОГО ОБЩЕСТВА» 60.5 KB
  Малоэффективны поэтому реальными заслонами на пути лавины может служить лишь инерция сила привычки массового сознания и поведения а также относительная кратковременность всякого эмоционального состояния общества будь то увлечение или отталкивание восторг и страх. Эмоциональный всплеск оказался кратковременным уже в октябре ноябре стали усиливаться факторы массового разочарования и отчуждения. Ни устойчивые демократические институты ни устойчивая расстановка основных политических сил не сложились. Негативная мобилизация охватила...
29485. ФАКТОРЫ ПЕРЕМЕННЫЕ И ПОСТОЯННЫЕ: СВОДНЫЙ МОНИТОРИНГ 1994–1995 гг. 83.5 KB
  Объединенный мониторинг (апрель 1994 г. — май 1995 г.) суммирует данные девяти исследований, проведенных в течение года, свободного от электоральной горячки. Как видно из приводимых ниже данных, основные показатели социальных процессов и оценки событий в общественном мнении за этот период оставались практически стабильными. На этом внешне спокойном фоне выделяются три зоны достаточно резких сдвигов
29486. ПИРАМИДА ОБЩЕСТВЕННОГО МНЕНИЯ В ЭЛЕКТОРАЛЬНОМ «ЗЕРКАЛЕ» 100 KB
  После выборов 24 опрошенных утверждали что приняли решение в последние дни а 4 на участке. При этом собственное решение сочли вполне обдуманным и взвешенным 45 скорее таковым 27 скорее эмоциональным 9 полностью эмоциональным 4 затруднились оценить свое решение 15 опрошенных. Таблица 1 Мера обдуманности и время принятия решения о голосовании в от числа опрошенных Насколько обдуманным было принятое решение Задолго до начала избирательной кампании В начале осени Примерно в октябре Примерно в ноябре В последние дни перед...
29487. СОЦИАЛЬНО-ПРОСТРАНСТВЕННАЯ СТРУКТУРА РОССИЙСКОГО ОБЩЕСТВА: ЦЕНТР И РЕГИОНЫ 80.5 KB
  Кроме того постоянные попытки союзного а потом российского политического руководства сохранить влияние на административные регионы в этих условиях постоянно приводили к усилению локальных элит и привилегий конституированных в частности в верхней палате нынешнего парламента.в от числа участвовавших в голосовании Регионы Реформисты Консерваторы Север и СевероЗапад области 57 49 республики 54 46 центральный 43 57 ВолгоВятский области 44 56 республики 34 66 ЦентральноЧерноземный 29 71 Приволжский области 37 64 республики 60...
29488. СТРУКТУРА РОССИЙСКОГО ЭЛЕКТОРАЛЬНОГО ПРОСТРАНСТВА 87 KB
  Кроме того результаты всеобщих выборов могут служить средством проверки не только исследовательских данных но также моделей и гипотез относительно ряда параметров социальной и политической реальности. практически непрерывная электоральная ситуация определила не только фон и меру но в значительной мере и само содержание социальнополитической жизни характер политических решений и требований. Ваше настроение в последние дни Прекрасное 3 3 Нормальное ровное 35 31 Напряжение раздражение 40 45 Страх тоска 13 10 Затруднились ответить 9 9 С...
29489. «ЧЕЛОВЕК ПОЛИТИЧЕСКИЙ»: СЦЕНА И РОЛИ ПЕРЕХОДНОГО ПЕРИОДА 90.5 KB
  Распад этой системы привел или приводит к обособлению повседневности от официальной жизни экономической сферы от политической ценностных императивов от инструментальных и т. За эти десять лет определились характерные черты политических институтов политической сцены и политического человека переходного типа. Распад механизма централизованной мобилизации около пяти лет назад не привел ни к реальному плюрализму социальнополитического действия ни к формированию каналов массового участия в политической жизни. Действенным средством...