Int getx() {return X;}
};
2.17
Исключительные ситуации.
Обработка исключительных ситуаций позволяет избегать аварийных ситуаций и правильно реагировать на ошибки, возникающие в ходе выполнения программы.
Особенности:
автоматический вызов процедур обработки ошибок
польза при выходе из глубоко вложенных функций при возникновении ощибок
упрощает процесс создания программ
try
{
// контролируемый код
}
catch( тип1 аргумент )
{
// код обработки
}
catch( тип2 аргумент )
{
// код обработки
}
...
Оператор throw.
Предназначен для явной генерации исключительной ситуации.
throw аргумент;
Особенности:
генерирует исключительную ситуацию с типом,соответствующим типу аргумента
значение аргумента throw передается аргументу оператора catch соответствующего типа
2.18
Блок try.
Код, подлежащий контролю, должен выполнятся внутри блока try.
Особенности:
число операторов внутри блока значения не имеет
код в блоке выполняется до возникновения исключительнйо ситуации
если есть подходящий для обработки исключения catch, то программа переходит к его выполнению
если отсутствует подходящий оператор catch, то при этом автоматически вызывается функция terminate() или abort().
2.19
Оператор catch.
Содержит код обработки исключительной ситуации.
Особенности:
получает управление только при возникновении исключительной ситуации в расположенном выше блоке try
если ошибку исправить невозможно, то необходимо в catch явно прервать программу или сгенерировать новую исключительную ситуацию
если обработка не требует завершения программы, то после блока catch програма продолжит выполнение со следующего после него оператора
оператор catch начинает выполняться только если тип его аргумента совпадает с типом исключительной ситуации
при перехвате исключительных ситуаций аргументу catch присваивается некоторое значение ( аргумент может быть объектом встроенного типа или класса )
2.20
Перехват исключений базового и производного классов.
оператор catch, перехватывающий исключения типа базового класса, также перехватывает исключения всех производных типов этого класса
для перехвата исключения только ПРОИЗВОДНОГО класса в последоавтельности операторов catch тип базового класса должен стоять позже типа производного
компилятор может дать предупреждение, если обработчик базового класса расположен раньше производного
2.21
Перехват всех исключительных ситуаций происходит с помощью оператора
catch ( ... ) { /* ... */ }
используется если нет особенностей перехвата разнотипных исключительых ситуаций
ставится последним в цепочке операторов для упрощения цепочки перехвата и исключения неконтролируемого аварийного завершения программы
2.22
Перехват классов исключительных ситуаций.
Так как исключительная ситуация может иметь любой тип,то в практических приложениях чаще используются исключительные ситуации, определенные программистом.
Особенности:
классы позволяют более полно описать возникшую ошибку
инкапсулирование информации об ошибке в таком классе позволяет пояснить ошибку пользователю или даже ее исправить
можно использовать стандартный класс и функции, определенные в <exception>
Ограничение исключительных ситуаций.
Можно ограничить виды типовисключительных ситуаций, которые может генерировать функция в программе:
тип имя_функции (аргументы) throw (список_типов)
{
// ...
}
Особенности:
функция может генерировать только исключительные ситуации типов, перечисленных в списке
при генерации исключительной ситуации другого типа выполняется аварийное завершение программы ( unexpected() )
можно задать пустой список типов
2.23
Функция terminate ()
void terminate();
Особенности:
вызывается автоматически, если не обнаружен подходящий оператор catch
является последним средством обработки исключительных ситуации
по умолчанию вызывает функцию abort ()
можно изменить обработчик функции используя
terminate_handler set_terminate ( terminate_handler new handler) throw ()
однако он должен заканчиваться функцией abort()
#include <exception>
