![](/user_photo/2706_HbeT2.jpg)
- •1.Конструктор копирования
- •2.Перегрузка переопределение функц
- •3.Перегрузка бинарных операторов
- •4.Перегрузка унарных операторов
- •5.Static- и Const- компоненты класса
- •6.Организация внешн.Доступа к лок.Комп. Класса(Спецификатор friend)
- •7.Proxi-классы
- •8.Наследование простое
- •9.Множественное наследование
- •10.Виртуальные функции
- •11.Абстрактные классы
- •13.Шаблоны.Параметрезированные классы
- •12.Виртуальный деструктор
- •14.Совместное использование шаблонов и наследование
- •15.Реализация smart-указателя
- •16.Классы поддерживающие транзакцию
- •17.Преобразование типа.Явное преобразование типа
- •18.Преобразование типов определённых в программе
- •20.Строковые потоки,их свойства,назначение.
- •22.Организация файла последовательного доступа
- •24.Генерация исключений в конструкторах.Иерархия искл.В станд.Библиотеке
- •23.Организация файла произвольного доступа
- •25. Спецификации исключительных ситуаций
- •27. Исключительные ситуации.Основы обработки исключительных ситуаций
- •28. Задание собственного неожиданного обработчика
- •29. Исключительная ситуация, генерируемая оператором new
- •30. Перенаправление исключительных ситуаций
- •31.Категории итераторов.Основные итераторы
- •32. Категории итераторов.Основные итераторы
- •33.Пасивные и активные итераторы
- •34. Контейнеры последовательностей
- •35.Ассоциативные контейнеры
- •36.Адаптеры контейнеров
- •37.Патеррн (Абстрактная фабрика)
- •38.Патеррн (Строитель)
- •39. Патеррн (Адаптер)
- •40.Патеррн (Команда)
- •41.Спецификатор final в java
- •42.Вложенные и внутренние классы в java
- •43.Основы наследования в java
- •47.Абстрактные классы в java
- •44.Использование ключевого слова super в java
- •50.Интерфейсы в java
- •51.Множественное наследование в java
- •52.Конфликты имён при комбинировании интерфейсов в java
- •53.Расширение интерфейса в java
- •54. Исключительные ситуации. Обработка исключений java
27. Исключительные ситуации.Основы обработки исключительных ситуаций
Обработка исключительных ситуаций лишена недостатков вышеназванных методов реагирования на ошибки. Этот механизм позволяет использовать для представления информации об ошибке объект любого типа. Поэтому можно, например, создать иерархию классов, которая будет предназначена для обработки аварийных событий. Это упростит, структурирует и сделает более понятной программу.
Рассмотрим более подробно элементы try, catch и throw механизма обработки исключений.
Блок try. Синтаксис блока:
try{ охранный код }
список обработчиков
Необходимо помнить, что после ключевого слова try всегда должен следовать составной оператор, т.е. после try всегда следует {…}. Блоки try не имеют однострочной формы, как, например, операторы if, while, for.
Еще один важный момент заключается в том, что после блока try должен
следовать, по крайней мере, хотя бы один обработчик.
Обработчики исключительных ситуаций catch. Обработчики исключи-
тельных ситуаций являются важнейшей частью всего механизма обработки исключений, так как именно они определяют поведение программы после генерации и перехвата исключительной ситуации. Синтаксис блока catch имеет следующий вид:
catch(тип 1 <аргумент>){
тело обработчика
}
catch(тип 2 <аргумент>)){
тело обработчика
}
. . .
catch(тип N <аргумент>)){
тело обработчика }
28. Задание собственного неожиданного обработчика
Так же как и обработчик terminate(), обработчик unexpected() позволяет
перед завершением программы выполнить какие-то действия. Но в отличие от обработчика завершения неожиданный обработчик может сам генерировать исключительные ситуации. Таким образом, собственный неожиданный обработчик может сгенерировать исключительную ситуацию, на этот раз уже входящую в спецификацию. Установка собственного неожиданного обработчика выполняется с помощью функции set_unexpected(). Приведенная ниже программа демонстрирует применение спецификации исключений и перехват неожиданных исключительных ситуаций с помощью собственного обработчика.
#include <iostream>
using namespace std;
#include <exception>
class first{};
class second : public first{};
class third : public first{};
class my_class{};
void my_unexpected()
{ cout<<"my_unexpected handler"<<endl;
throw third(); // возбуждение исключения типа объект
} // класса third
void f(int i) throw(first) // указание спецификации исключения
{ if(i ) throw second(); //
else throw my_unexpected();
}
int main()
{ set_unexpected(my_unexpected);
try {
f(1);
}
catch(first) {
cout<<"first handler"<<endl;
}
catch(my_class) {
cout<<"my_class handler"<<endl;
}
try{
f(0);
}
catch(first) {
cout<<"first handler"<<endl;
}
catch(my_class) {
cout<<"my_class handler"<<endl;
}
return 0;
}
Результат выполнения программы:
first handler
my_unexpected handler
first handler
В данной программе вызов функции f() во втором блоке try приводит к
тому, что генерируется исключительная ситуация, тип которой не указан в спецификации, поэтому вызывается установленный нами неожиданный обработчик, где происходит генерация исключения, которая успешно обрабатывается.