Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Обработка исключительных ситуаций

.pdf
Скачиваний:
5
Добавлен:
09.05.2015
Размер:
165.12 Кб
Скачать

Обработка исключительных

ситуаций

Процесс обработки ошибочной ситуации

Выявление ошибочной ситуации

Генерация информации о возникновении ошибочной ситуации

Обработка ошибки

Методы обработки ошибок

Обработка ошибки на месте

Использование возвращаемых значений

Использование глобальных переменных

Использование специальных функций

Использование генерации и обработки исключений

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

try{

Контролируемый

блок

 

throw выражение_генерации_исключения;

}

catch(тип исключение){

}

Обработчик

исключений

Пример 1

#include <iostream> using namespace std;

int main()

{

try{ float a,b;

cin>>a>>b;

if (b==0) throw 1; cout<<a/b;

}

catch (int&){ cout<<"Devision by zero!!!";

}

cin.get();

return 0;

}

Пример 2

#include <iostream> #include <fstream> using namespace std; int main(

{

try{

ifstream fin("in.txt"); if (!fin) throw 2; float a,b; fin>>a>>b;

if (b==0) throw 1; ofstream fout("dat.txt"); if(!fout) throw 3; fout<<a/b;

fout.close();

fin.close();

}

catch (int& a){ switch(a){

case 1:cout<<"Devision by zero!!!"; break;

case 2:cout<<"Input file open error";

break;

case 3:cout<<"Output file open error";

break;

}

}

cin.get(); return 0;

}

Тип исключения

Любой стандартный тип (int, float, char*)

Пользовательский тип

Пример 3 Несколько catch()

#include <iostream> #include <fstream> using namespace std;

int main()

{

try{

ifstream fin("in.txt");

if (!fin) throw "Error open input file";

float a,b; fin>>a>>b;

if (b==0) throw 1;

ofstream fout("dat.txt");

if(!fout) throw "Error open output file";

fout<<a/b;

}

catch (int&){ cout<<"Devision by zero!!!";

}

catch (char* err)

{

cout<<err;

}

return 0;

}

Ограничение использования catch(…)

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

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

обработка исключений в случае, если функция , генерирующая исключение, нарушила контракт, в соответствии с которым может генерировать только определенные виды исключений.

Исключение классового типа

#include <iostream> #include <fstream> using namespace std; class Except{

char err[255]; public: Except(char* s){ strcpy(err,s);} void what(){ cout<<err<<endl;} };

int main()

{

try{

ifstream fin("in.txt");

if (!fin) throw Except("Input file open error");

float a,b;

fin>>a>>b;

if (b==0) throw Except("Devision by zero!!!");

ofstream fout("dat.txt");

if(!fout) throw Except("Output file open error");

fout<<a/b;

fout.close();

fin.close();

}

catch (Except &e){ e.what();

}

cin.get(); return 0; }