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.


 

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

39141. Разработка адаптивной системы автоматического управления электроприводами вспомогательного электрооборудования автомобилей 11.82 MB
  Постановка задач исследования Обзор электронных систем управления. Принципы построения адаптивных систем автоматического управления. Анализ разработок адаптивных систем автоматического управления двигателем постоянного тока в приводах вспомогательного электрооборудования автомобиля.
39142. Повышение эффективности диагностирования изделий имеющих активно-индуктивную нагрузку в электрооборудовании автомобилей 254.5 KB
  Однако в условиях массового производства автомобилей когда производительность лимитирована ритмом сборочного конвейера в виду длительности процесса диагностирования всего комплекса автомобильного электрооборудования сплошной выходной контроль его качества существенно затруднен. Таким образом становится актуальной важная научнотехническая задача повышения качества и оперативности диагностирования автомобильного электрооборудования имеющего активноиндуктивную нагрузку решение которой позволит ввести сплошной выходной контроль в массовом...
39143. Оптимизация комбинированной энергетической установки электротранспортного средства 358 KB
  Прежде всего это ограниченный пробег без подзарядки бортового источника энергии. Поэтому актуальной является проблема оптимизации параметров бортовой энергоустановки в том числе совместным применением накопителей энергии различной физической природы в ее составе. Таким образом становится актуальной важная научнотехническая задача повышения энергоэффективности тяговой системы этого транспортного средства решение которой существенно повысит эффективность использования ограниченного запаса энергии на борту внося заметный вклад в...
39144. ИСТОКИ ТОТАЛИТАРИЗМА 100.5 KB
  ИСТОКИ ТОТАЛИТАРИЗМА Тоталитарные движения возможны везде где имеются массы по той или иной причине приобретшие вкус к политической организации. Массы держит вместе не сознание общих интересов и у них нет той отчетливой классовой структурированности которая выражается в определенных ограниченных и достижимых целях. Термин массы применим только там где мы имеем дело с людьми которых в силу либо просто их количества либо равнодушия либо сочетания обоих факторов нельзя объединить ни в какую организацию основанную на общем интересе в...
39145. ВЕРОЯТНОСТНО-СТАТИСТИЧЕСКИЕ МОДЕЛИ ЭКСПЛУАТАЦИИ ЛЕТАТЕЛЬНЫХ АППАРАТОВ 9.88 MB
  В зависимости от физической сущности моделируемого объекта или процесса и характера этого процесса могут использоваться законы распределения непрерывных или дискретных случайных величин. Естественно что при формировании вероятностностатистических моделей широко используются законы распределения случайных величин и правила оперирования с ними определяемые теорией вероятности и статистическими методами анализа. Формирование...
39146. УПРАВЛЕНИЕ ПРОЦЕССАМИ ТЕХНИЧЕСКОЙ ЭКСПЛУАТАЦИИ ЛЕТАТЕЛЬНЫХ АППАРАТОВ 1.47 MB
  Объектом управления является изделие ЛА, техническое состояние которого определяется параметрами , изменение которых во времени представляет собой монотонную случайную функцию времени t (рис. 3.1). Установлены предельно допустимые значения параметров , пересечение которых реализациями случайной функции означает отказ.
39147. Управление процессами технической эксплуатации изделий ЛА, заменяемых по состоянию 3.12 MB
  Лабораторная работа №2 Тема: Управление процессами технической эксплуатации изделий ЛА заменяемых по состоянию. Цель: Использование моделей экранов и замены изделий подверженных износу и старанию для управления процессами технической эксплуатации.Сформировать модель процесса технической эксплуатации изделий заменяемых по состоянию; 2.Определить характеристики процесса технической эксплуатации изделий заменяемые по состоянию; 2.
39149. Программное обеспечение вычислительной техники и автоматизированных систем 100.5 KB
  Техникум-интернат, как учреждение среднего профессионального образования получает право на общеобразовательную деятельность и льготы, представляемые законодательством Российской Федерации через лицензию, выданную Министерством социальной защиты населения Российской Федерации.