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

Процесс обработки ошибочной ситуации
•Выявление ошибочной ситуации
•Генерация информации о возникновении ошибочной ситуации
•Обработка ошибки

Методы обработки ошибок
•Обработка ошибки на месте
•Использование возвращаемых значений
•Использование глобальных переменных
•Использование специальных функций
•Использование генерации и обработки исключений

Обработка исключений
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; }