Перехоплення виключень
Коли за допомогою throw генерується виключення, функції виконавчої бібліотеки C++ виконують наступні дії:
1) створюють копію параметра throw у вигляді статичного об'єкту, який існує до тих пір, поки виключення не буде оброблено;
2) у пошуках відповідного обробника розкручують стек, викликаючи деструктори локальних об'єктів, що виходять з області дії;
3) передають об'єкт і управління обробникові, що має параметр, сумісний з типом цього об'єкту.
При розкручуванні стека всі обробники на кожному рівні є видимими послідовно, від внутрішнього блоку до зовнішнього, поки не буде знайдений відповідний обробник.
Обробник вважається знайденим, якщо тип об'єкту, вказаного після throw:
– той же, що і вказаний в параметрі catch (параметр може бути записаний у формі Т, const Т, Т& або const Т&, де Т – тип виключення);
– є похідним від вказаного в параметрі catch (якщо спадкування проводилося з ключем доступу public);
– є вказівкою, яка може бути перетворена по стандартних правилах перетворення вказівок до типу вказівки в параметрі catch.
Обробники похідних класів слід розміщувати до обробників базових, оскільки інакше їм ніколи не буде передано управління. Обробник вказівки типу void автоматично приховує вказівку будь-якого іншого типу, тому його також слід розміщувати після обробників вказівок конкретного типу.
Розглянемо приклад.
#include <fstream>
using namespace std;
Дата добавления: 2014-12-26; просмотров: 942;