Обработка исключений. Лекция 12

Содержание

Слайд 2

Исключительная ситуация (исключение, exception) — это ошибка времени выполнения программы или иная

Исключительная ситуация (исключение, exception) — это ошибка времени выполнения программы или иная
(возможно внешняя) проблема, приводящая к невозможности или бессмысленности дальнейшей отработки программой её базового алгоритма.
Примеры исключительных ситуаций:
1) деление на ноль в очередном операторе
2) отсутствие файла для чтения данных
3) блокировка записи в базе данных
4) нехватка динамической памяти
5) отключение

Исключительные ситуации

Слайд 3

Синхронные – возникают только в определённых, заранее известных точках программы. Примеры: ошибка

Синхронные – возникают только в определённых, заранее известных точках программы. Примеры: ошибка
чтения файла или коммуникационного канала, нехватка памяти.
Асинхронные – возникают в любой момент времени и не зависят от того, какая конкретно инструкция программы выполняется. Примеры: аварийный отказ питания; поступление новых данных в момент, когда они не ожидаются.

Виды исключений

Слайд 4

Обработка ошибок в языке С – функция возвращает код ошибки
int DoSomething()

Обработка ошибок в языке С – функция возвращает код ошибки int DoSomething()
{
long *a = malloc(sizeof(long) * 10);
if (a == NULL)
return 1;
FILE *b = fopen("mydata.txt", "rb");
if (b == NULL)
{
free(a);
return 2;
}
}

Слайд 5

Реакция программы на ошибку (исключение)
1) прекращение выполнения программы
2) попытка

Реакция программы на ошибку (исключение) 1) прекращение выполнения программы 2) попытка исправить
исправить ситуацию
3) если исправление невозможно, то выдача
сообщения об ошибке
При обработке исключения программой управление передается заранее определенному обработчику исключения – блоку кода, выполняющему необходимые действия по минимизации потерь.

Исключительные ситуации в С++: обработка исключений

Слайд 6

Ключевые слова С++
throw (бросать) – генерация исключения, то есть сигнала о возникновении

Ключевые слова С++ throw (бросать) – генерация исключения, то есть сигнала о
ошибки;
try (пытаться) – обозначение контролируемого блока кода, в котором возможно возникновение ошибок;
catch (ловить) – собственно обработка исключения, в том числе попытки исправить ошибки.

Обработка исключений в С++

Слайд 7

Обработка исключения начинается с появления ошибки. Функция, в которой возникла ошибка, генерирует

Обработка исключения начинается с появления ошибки. Функция, в которой возникла ошибка, генерирует
исключение.
Синтаксис
throw выражение;
Здесь выражение определяет вид исключения.
Пример:
if (x == 0)
throw ”деление на ноль!”;

1) Генерация (выброс) исключения

Слайд 8

Обработка исключения производится внутри контролируемого блока, то есть набора потенциально опасных операторов,

Обработка исключения производится внутри контролируемого блока, то есть набора потенциально опасных операторов,
выполнение которых может привести к ошибкам.
Синтаксис определения контролируемого блока
try
{
операторы;
}

2) Контролируемый блок кода

Слайд 9

Обработчик исключения располагается непосредственно за блоком try и начинается с ключевого слова

Обработчик исключения располагается непосредственно за блоком try и начинается с ключевого слова
catch. Вслед за ним в скобках указывается тип обрабатываемого исключения.
Формы записи
catch (тип имя) { тело_обработчика; }
catch (тип) { тело_обработчика; }
catch (...) { тело_обработчика; }

3) Обработчик исключения

Слайд 10

#include
class Hello
{
// Класс, информирующий о своем

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

// создании и уничтожении
public:
Hello(){ cout << "Hello!" << endl; }
~Hello(){ cout << "Bye!" << endl; }
};

Пример обработки исключения

Слайд 11

void f1() // функция, содержащая ошибку
{
ifstream ifs("\\INVALID\\FILE\\NAME");
if (!ifs)

void f1() // функция, содержащая ошибку { ifstream ifs("\\INVALID\\FILE\\NAME"); if (!ifs) {
{
cout << "Генерируем исключение";
throw "Ошибка открытия файла";
}
}
void f2() // функция, вызывающая f1
{
Hello Н; // Создаем объект Н
f1(); // Вызываем функцию f1
}

Слайд 12

int main()
{
try
{
cout << "Вход в try-блок" <<

int main() { try { cout f2(); cout } catch(int i) {
endl;
f2();
cout << "Выход из try-блока" << еndl;
}
catch(int i)
{
cout << "Вызван обработчик int" < return -1;
}
...

Слайд 13

...
catch(const char *p)
{
cout << "Вызван обработчик const char*.

... catch(const char *p) { cout \nИсключение - " return -1; }

\nИсключение - " << p << endl;
return -1;
}
catch(...)
{
cout << "Вызван обработчик всех
исключений" << endl;
return -1;
}
return 0; // Все обошлось благополучно
}
Вход в try-блок
Hello!
Генерируем исключение
Bye!
Вызван обработчик const char *.
Исключение – Ошибка открытия файла

Слайд 14

Последовательность событий при возникновении ошибки
1) Код выполняется стандартно вне контролируемого блока try.
2)

Последовательность событий при возникновении ошибки 1) Код выполняется стандартно вне контролируемого блока
Управление переходит в контролируемый блок (try).
3) Какое-то выражение в этом блоке приводит к возникновению ошибки.
4) Производится генерация исключения (throw).
5) Управление передается обработчику событий (catch).

Слайд 15

#include
using namespace std;
const int MAX = 3; // 3

#include using namespace std; const int MAX = 3; // 3 элемента
элемента
class Stack
{
private:
int st[MAX]; // массив данных
int top; // вершина стека
public:
class Range{};
Stack(){ top = -1; }
...

Другой пример – стек

Слайд 16

void push(int var)
{
if(top >= MAX-1) //если стек полон,
throw Range();

void push(int var) { if(top >= MAX-1) //если стек полон, throw Range();
//исключение
st[++top] = var; //помещаем число
}
//-----------------------------------
int pop()
{
if(top < 0) //если стек пуст,
throw Range(); //исключение
return st[top--]; //извлечь число
}
};
...

Слайд 17

int main()
{
Stack s1;
try
{
s1.push(11);
s1.push(22);
s1.push(33);
s1.push(44); //Стек

int main() { Stack s1; try { s1.push(11); s1.push(22); s1.push(33); s1.push(44); //Стек
переполнен!
cout << "1: " << s1.pop() << endl;
cout << "2: " << s1.pop() << endl;
cout << "3: " << s1.pop() << endl;
cout << "4: " << s1.pop() << endl;
//Стек пуст!
}
Имя файла: Обработка-исключений.-Лекция-12.pptx
Количество просмотров: 45
Количество скачиваний: 0