Приклад рішення задачі
Див. проект «Task18».
Контрольні питання
Що таке параметризація?
Що таке і як використовуються родові класи?
Що таке спеціалізація класу?
Наведіть приклади використання родових класів?
Коли зручно використовувати шаблонні функції?
Що таке STL?
Наведіть приклад використання контейнерів STL.
Наведіть приклад використання алгоритмів STL.
Наведіть приклад використання функторів.
Вкажіть переваги параметрезованих контейнерів у порівнянні з непараметрізованими.
19 Виключення. Обробка помилок
Лабораторна робота №19
Мета: ознайомитися з механізмом обробки виключень в C++.
Індивідуальне завдання
При розробці проекту використовувати раніше обрану прикладну область та реалізовану функціональність.
Продемонструвати ефективність використання виключень для контролю за операціями збереження у файл і відновлення з файлу вмісту контейнерів.
При тестуванні продемонструвати розкручування стека – автоматичне знищення (виклик деструкторів) всіх стекових об’єктів між throw і catch.
Запропонувати спосіб звільнення пам’яті від динамічних об’єктів, які були створені до виникнення виключення.
Термінологія
Обробка виключень (exception handling) – виняткових ситуацій – дозволяє впорядкувати обробку помилок часу виконання. Використовуючи обробку виключень, програма може автоматично викликати функцію-обробник помилок тоді, коли така помилка виникає. Принциповою перевагою обробки виключень є те, що вона дозволяє автоматизувати велику частину коду для обробки помилок.
Базовий принцип, на якому заснована обробка виключень – відновлення стану і вибір альтернативних дій у разі помилки.
Обробка виняткових ситуацій забезпечує спосіб передачі управління та інформації в невизначену точку, де було висловлено бажання обробляти ситуації даного типу. Ситуації будь-якого типу можуть збуджуватися (throw) і перехоплюватися (catch). Для функції може бути перераховано безліч ситуацій, які можуть бути в ній порушені.
Реакція буде викликана тільки в разі виконання вираження збудження всередині блоку з контролем або у функціях, викликаних з цього блоку.
Синтаксис блоку з контролем :
try {...} <список реакцій>
Список реакцій являє собою наступну конструкцію:
catch (<оголошення ситуації>) {...}
[catch (<оголошення ситуації>) {...} ...]
Вираз збудження має наступний синтаксис:
throw <вираз>;
При порушенні ситуації (тобто виконанні оператора throw) управління передається на реакцію. Тип операнда оператора throw визначає, які реакції можуть перехоплювати дану ситуацію.
Якщо серед реакцій блоку з контролем не знайдено відповідної реакції, пошук реакції триває в блоці з контролем, що охоплює даний.
Якщо в програмі не знайшлося відповідної реакції, викликається функція terminate(). Функція terminate() викликає функцію, задану при останньому зверненні до функції set_terminate(). За замовчуванням функція, що викликається з функції terminate(), є abort(). Функція, що викликається функцією terminate(), повинна завершувати виконання програми.
Виключення є об’єктом деякого класу, який є представленням виняткового випадку. Код, що виявив помилку, генерує об’єкт інструкцій throw. Фрагмент коду висловлює своє бажання обробляти виключення за допомогою інструкції catch. Результатом генерації виключення інструкцією throw є розкручування стека до тих пір, поки не буде виявлений відповідний catch у функції, яка безпосередньо або опосередковано викликала функцію, що генерує виняток.
Сам факт генерації виключення передає інформацію про помилку і її тип. Крім того, виключення може містити додаткову інформацію. Фундаментальною метою техніки обробки винятків є передача інформації для відновлення після виникнень проблеми і для здійснення цього надійним і зручним способом.
Одна з принципових переваг стандартної схеми обробки виключень –розкручування стеку (unwinding the stack). При запуску виключення автоматично викликаються деструктори всіх стекових об’єктів між throw і catch.
Таким чином гарантується виклик деструкторів всіх стекових об’єктів, сконструйованих з початку виконання try-блоку. Це може знадобитися для закриття відкритих файлів, запобігання витоку пам’яті etc. Проте, справа не обходиться без деяких нюансів.
Якщо під час конструювання об’єкта відбудеться виключення, деструктори будуть викликані для тих компонентів (базових класів і змінних), конструктори яких були виконані до моменту виникнення винятку.
Do'stlaringiz bilan baham: |