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.


 

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

26250. Внесение удобрений 70.5 KB
  Домашнее задание Внесение удобрений Цель и задачи. Сформировать умение оперативно принимать решение по выбору оптимальных норм способов и сроков внесения удобрений в различных агротехнологиях в зависимости от изменяющихся агроэкологических и производственных условий. Рассматриваются нормы сроки и способы внесения удобрений в том числе микроудобрений в зависимости от агроэкологических и производственных условий. Сроки и способы внесения удобрений.
26251. Оценка устойчивости ландшафтов и агроландшафтов и их антропогенной преобразованности 71 KB
  13 Практическое задание Оценка устойчивости ландшафтов и агроландшафтов и их антропогенной преобразованности Цели и задачи. Сформировать представление об устойчивости природных ландшафтов и агроландшафтах видах экологической устойчивости определяющих ее факторах о цене экологической устойчивости агроландшафтов и принципах ее обеспечения. Затраты на ее поддержание определяют цену устойчивости агроландшафта. Дать характеристику экологической агрономической и экономической устойчивости определенного агроландшафта.
26252. Оценка экологической емкости агроландшафта 49 KB
  14 Домашнее задание Оценка экологической емкости агроландшафта Цели и задачи. Сформировать представление о способности агроландшафта воспринимать антропогенную нагрузку при сохранении экологической устойчивости и критериях ее оценки. Формируется понятие экологической емкости агроландшафта и определяющие ее условия. Дать оценку экологической емкости агроландшафта на примере конкретного земельного массива Оценка экологическая емкость агроландшафта Чтобы обеспечить экологическую устойчивость агроландшафта необходимо задать такие параметры...
26253. Значение и место альтернативных технологий в земледелии 47 KB
  Сформировать представление об агротехнологиях альтернативного земледелия как социальном явлении их формах причинах агрономических ограничений возможностях использования. Принципы и источники альтернативного земледелия его мотивации. Основателем данного направления считают австрийского философа Рудольфа Штайнера сформулировавшего в 1924 году принципы так называемого биодинамического земледелия как развитие созданного им мистического учения антропософии. В то же время продукция органического земледелия отнюдь не застрахована от природных...
26254. Агроэкологические требования сельскохозяйственных культур как исходный критерий агрооценки земель 38.5 KB
  Близкие по условиям возделывания конкретных сельскохозяйственных растений ЭАА объединяются в агроэкологические типы земель в пределах которых формируются производственные участки. Пока что не все аспекты агроэкологической оценки растений разработаны с достаточной полнотой особенно почвенные некоторые трудно поддаются формализации. Следует ускорить разработку региональных рекомендаций по данному вопросу с учетом местных условий культур сортов растений. Отношение растений к свету: размещение растений по реакции на продолжительность дня...
26255. Выбор, размещение и сельскохозяйственных культур и сортов и разработка агроэкологических карт в АгроГИС 64 KB
  Ключевые слова: виды сорта культур агроэкологическая оценка интенсивные пластичные устойчивые сорта агроэкологическая карта категории пригодности. Выбор культуры и сорта. Выбор культуры и сорта Выбор культур для региона конкретного хозяйства и поля осуществляют на основе оценки их биологических требований и средообразующего влияния. Показатели агроэкологической оценки культур указанные в паспорте сорта сравниваются с соответствующими параметрами агроландшафта.
26256. Управление продукционным процессом сельскохозяйственных культур и агроценозами 54 KB
  В процессе генерации технологических решений с помощью специально разработанного интерфейса СППР автоматически формируется задание на выполнение конкретной операции в режиме точного земледелия которое затем загружается в бортовой компьютер сельскохозяйственной техники. В зависимости от режима реализации операции различают два типа задания: Карта операции режим функционирования offline Карта агротребований на выполнение операции режим online Карта операции электронная карта поля где для каждого однородного участка поля указана...
26257. Защита растений от вредителей и болезней в агроценозах 327.5 KB
  Практическое занятие Защита растений от вредителей и болезней в агроценозах Цели и задачи. Развить способность практиковать интегрированный подход к защите растений и умение использовать современные методы и средства борьбы с вредителями и болезнями. Рассматриваются агротехнические химические и биологические методы защиты растений от болезней и вредителей при различных уровнях интенсификации агротехнологий и интегрированном подходе. Разработать систему мер по защите растений в заданном севообороте при заданной фитосанитарной ситуации.
26258. Создание картограмм агрофизического состояния почв и интерпретация результатов в геоинформационных системах (ГИС) 384 KB
  Практическое занятие Создание картограмм агрофизического состояния почв и интерпретация результатов в геоинформационных системах ГИС Цели и задачи. Приобретение навыков картографирования агрофизического состояния почв с использованием педотрансферных функций и ГИСтехнологий. Рассматривается методика разработки картограмм агрофизических свойств почв в геоинформационных системах на примере плотности почв и запасов продуктивной влаги. Освоить методику картографирования физических и воднофизических свойств почв на конкретном первичном...