ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ

Содержание

Слайд 2

1. прервать выполнение программы; 2. возвратить значение ошибки; 3. вывести сообщение

1. прервать выполнение программы;
2. возвратить значение ошибки;
3. вывести сообщение об ошибке

в поток cerr и вернуть вызывающей программе некоторое приемлемое значение, которое позволит ей продолжить работу
Слайд 3

Исключительная ситуация или исключение – это возникновение непредвиденного или аварийного события,

Исключительная ситуация или исключение – это возникновение непредвиденного или аварийного события,

которое может порождаться некорректным использованием аппаратуры
Слайд 4

Исключения позволяют логически разделить вычислительный процесс на две части: обнаружение аварийной ситуации; обработка аварийной ситуации

Исключения позволяют логически разделить вычислительный процесс на две части:
обнаружение аварийной

ситуации;
обработка аварийной ситуации
Слайд 5

Общий механизм обработки исключений Контролируемый блок – составной оператор, перед которым

Общий механизм обработки исключений

Контролируемый блок – составной оператор, перед которым написано

ключевое слово try
Обработка исключения начинается с появления ошибки. Функция, в которой она возникла, генерирует исключение. Для этого используется ключевое слово throw с параметром, определяющим вид исключения. Параметр может быть константой, переменной или объектом и используется для передачи информации об исключении его обработчику
Отыскивается соответствующий обработчик исключения и ему передается управление
Если обработчик исключения не найден, вызывается стандартная функция terminate, которая вызывает функцию abort, аварийно завершающую текущий процесс. Можно установить собственную функцию завершения процесса
Слайд 6

Определение исключений Выделить контролируемый блок – блок try Предусмотреть генерацию одного

Определение исключений

Выделить контролируемый блок – блок try
Предусмотреть генерацию одного или нескольких

исключений операторами throw внутри блока try или внутри функций, вызываемых из этого блока
Разместить сразу за блоком try один или несколько обработчиков исключений catch
Слайд 7

try { // фрагмент кода } throw выражение Тип выражения, стоящего

try { // фрагмент кода }
throw выражение
Тип выражения, стоящего после throw,

определяет тип порождаемого исключения
catch ( … ) { // действия по обработке исключения }
Слайд 8

catch (Type info) { // обработка исключения типа Type // с

catch (Type info)
{ // обработка исключения типа Type

// с использованием значения info
}
catch (Type)
{ // обработка исключения типа Type}
catch (…)
{ // обработка исключений всех типов}
Слайд 9

Перехват исключений Создают копию параметра throw в виде статического объекта, который

Перехват исключений

Создают копию параметра throw в виде статического объекта, который существует

до тех пор, пока исключение не будет обработано;
В поисках подходящего обработчика раскручивают стек, вызывая деструкторы локальных объектов, выходящих из области действия;
передают объект и управление обработчику, имеющему параметр, совместимый по типу с этим объектом
Слайд 10

Обработчик считается найденным, если тип объекта, указанного после throw: тот же,

Обработчик считается найденным, если тип объекта, указанного после throw:
тот же, что

и указанный в параметре catch (параметр может быть записан в форме T, Const T, T& или const T&, где T – тип исключения);
является производным от указанного в параметре catch (если наследование производилось с ключом доступа public):
является указателем, который может быть преобразован по стандартным правилам преобразования указателей к типу указателя в параметре catch.
Слайд 11

Пример #include // класс, информирующий о своем // создании и уничтожении

Пример

#include
// класс, информирующий о своем
// создании и

уничтожении
class Hello
{Hello() { cout << “Hello!” << endl; }
~Hello() { cout << “Bye!” << endl; }
};
Слайд 12

void f1( ) {ifstream ifs(name); // открываем файл if (!ifs) {

void f1( )
{ifstream ifs(name); // открываем файл
if (!ifs)
{

cout << “генерируем исключение ” << endl;
throw “Ошибка при открытии файла”;
}
}
void f2( )
{Hello H; // создаем локальный объект
f1(); // вызываем функцию, генерирующую исключение
}

Пример

Слайд 13

Пример int main( ) { try { cout f2( ); cout

Пример

int main( )
{ try
{ cout << “входим в try-блок”

<< endl;
f2( );
cout << “выходим из try-блока” << endl;
}
catch( int i)
{ cout << “вызван обработчик int, исключение - ” << i;
cout << endl;
return -1;
}
Слайд 14

Пример catch( const char * p) { cout cout return -1;

Пример

catch( const char * p)
{ cout << “вызван

обработчик const char *”;
cout << “, исключение - ” << p << endl;
return -1;
}
catch( … )
{ cout << “вызван обработчик всех исключений ”;
cout << endl;
return -1;
}
return 0; // обошлось без исключительных ситуаций
}