Раскручиванием стека называется процесс освобождения памяти
из-под локальных переменных и возврата управления вызывающей функ-
ции. Когда функция завершается, происходит естественное раскручива-
ние стека. Тот же самый механизм используется и при обработке исклю-
чений.
Обработчик считается найденным, если тип объекта, указанного
после throw:
тот же, что и указанный в параметре catch (параметр может быть запи-
сан в форме Т, const T, T & или const T &, где Т– тип исключения);
является производным от указанного в параметре catch (если насле-
дование производилось с ключом доступа public);
является указателем, который может быть преобразован по стандарт-
ным правилам преобразования указателей к типу указателя в пара-
метре catch.
Таким образом, обработчики производных классов следует разме-
щать до обработчиков базовых, поскольку в противном случае им нико-
гда не будет передано управление. Обработчик указателя типа void авто-
матически скрывает указатель любого другого типа, поэтому его также
следует размещать после обработчиков указателей конкретного типа.
Классы исключений. Средствами С++ можно генерировать ис-
ключения любого встроенного типа, а также создавать специальные
классы исключений и использовать в throw либо объекты этих классов,
либо анонимные экземпляры. Использование собственных классов ис-
ключений предпочтительнее применения стандартных типов данных.
class MathError // базовый класс обработки ошибок
{
virtual void ErrorProc(){…} // обработка ошибки
};
class Overflow : public MathError // класс ошибки переполнения
52
{
virtual void ErrorProc(){…} // обработка ошибки
};
class ZeroDevide : public MathError // класс ошибки деление на 0
{
virtual void ErrorProc(){…} // обработка ошибки
};
Достарыңызбен бөлісу: |