- •ИСКЛЮЧЕНИЯ. СПЕЦИФИКАЦИЯ ИСКЛЮЧЕНИЙ
- •Любое необработанное исключение приводит к вызову функции terminate(), которая
- •Обработка ошибок
- •Пример. Обработка выхода за границы массива с помощью исключения
- •int& operator[](int i); int size(){return sz;}
- •int main() {
- •2) возвратить значение, трактуемое как "ошибка";
- •Вариант [2] можно реализовать не всегда, поскольку не всегда удается определить значение "ошибка".
- •Механизм особых ситуаций можно рассматривать как динамический аналог механизма контроля типов и проверки
- •Пример. Обработка двух исключений
- •Vector::Vector(int s) {
- •catch (Vector::Range) {
- •Примечание. Особые ситуации можно перехватывать в одной функции, можно в разных.
- •Передача данных при
- •class Range { public:
- •void f(int s, int i) { try {/*…*/}
- •2. Поддерживается окончательная модель обработки. Это означает, что после
- •5.Если обработчик «поймал» исключение, то обработка этого же исключения другими обработчиками, которые могут
- •Иерархия исключений
- •void f2() {
- •int main() { f2(); return 0;
- •int formula(int x, int y) {
- •int main() {
- •Особые ситуации могут быть членами нескольких групп.
- •void f3() {
- •int main() { f3(); f4();
int main() { f2(); return 0;
}
Пример. Обработка математических
исключений с иерархии классов.
class Matherror { };
class Overflow: public Matherror { }; class Zerodivide: public Matherror { };
class Underflow: public Matherror{};
int formula(int x, int y) {
if (x>2000000 || x<-2000000) throw Overflow();
if (y==0) throw Zerodivide(); return x*x/y;
}
void f2() {
try {formula(3000000,0);}
catch (Overflow) {cerr<<"Переполнение\n";} catch(Matherror) {
cerr<<"Ошибка математической операции\n";
}
}
int main() {
f2(); return 0;
}
Используя иерархическое упорядочивание особых ситуаций, можно:
1)разработать программу с ясной структурой;
2)избежать неполноты при перечислении в проверяемом блоке всех особые ситуаций;
3)при изменении семейства особых ситуаций можно избежать изменений в тех частях программы, которые обрабатывают эту особую ситуацию.
Особые ситуации могут быть членами нескольких групп.
Пример. Перехват файловых ошибок в сети.
class network_err {}; class file_system_err{};
class network_file_err: public network_err, public file_system_err {};
void network_file()
{
/*операторы*/
throw network_file_err();
}
void f3() {
try { /*операторы*/ network_file();
}
catch (network_err) { cerr<<"Ошибка сети\n";
}
}
void f4() {
try { /*операторы*/ network_file();
}
catch (file_system_err) { cerr<<"Ошибка в файловой системе\n"; }
}
int main() { f3(); f4();
return 0;
}