Слайд 2
![Когда программа конструируется из раздельных модулей, и, особенно, когда эти](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-1.jpg)
Когда программа конструируется из раздельных модулей, и, особенно, когда эти модули
находятся в независимо разработанных библиотеках, обработка ошибок должна быть разделена на две части:
генерация информации о возникновении ошибочной ситуации, которая не может быть разрешена локально;
обработка ошибок, обнаруженных в других местах.
Слайд 3
![try { ... } catch (объявление ситуации) { … }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-2.jpg)
try { ... } <список реакций>
catch (объявление ситуации) { … }
[ catch (объявление ситуации) { … } … ]
throw <выражение>;
Слайд 4
![terminate() set_terminate() abort()](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-3.jpg)
terminate()
set_terminate()
abort()
Слайд 5
![FILE *open(char *fname) { FILE *f = fopen("fname, "r"); if (!f) throw fname; return f; }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-4.jpg)
FILE *open(char *fname)
{ FILE *f = fopen("fname, "r");
if (!f)
throw fname;
return f;
}
Слайд 6
![void main() { try { FILE *f1 = open("in1.txt"); FILE](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-5.jpg)
void main()
{ try
{ FILE *f1 = open("in1.txt");
FILE *f2
= open("in2.txt");
}
catch (char *str)
{ printf("Impossible to open
file '%s'!\n", str);
return;
}
...
}
Слайд 7
![class Ex1 { private: int reason; public: Ex1() { ...](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-6.jpg)
class Ex1
{ private:
int reason;
public:
Ex1() { ... }
int Reason() { return reason; }
};
class Ex2 { };
Слайд 8
![void f1() { ... if (...) throw Ex1(0); if (...)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-7.jpg)
void f1()
{ ...
if (...) throw Ex1(0);
if (...) throw
Ex1(2);
...
if (...) throw Ex2();
}
void f2()
{ ...
if (...) throw Ex2();
}
Слайд 9
![void main() { try { ... f1(); ... f2(); ...](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-8.jpg)
void main()
{ try
{ ...
f1();
...
f2();
...
}
catch(Ex1 ex)
{ switch (ex.Reason())
{ case 0: ...
case 1: ...
case 2: ...
}
}
catch(Ex2 ex)
{ ... }
}
Слайд 10
![try { throw E(); } catch (H) { ... }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-9.jpg)
try
{ throw E(); }
catch (H)
{ ... }
Слайд 11
![Обработчик будет вызван, если: Н того же типа, что и](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-10.jpg)
Обработчик будет вызван, если:
Н того же типа, что и Е;
Н является
однозначно доступным публичным базовым классом для Е;
Н и Е являются указателями, и 1 или 2 выполняется для типов, на которые они ссылаются;
Н является ссылкой, и 1 или 2 выполняется для типа, на который ссылается Н.
Слайд 12
![class MathErr { ... }; class Overflow : public MathErr](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-11.jpg)
class MathErr { ... };
class Overflow : public MathErr
{ ...
};
class Underflow : public MathErr
{ ... };
class ZeroDivision : public MathErr
{ ... };
Слайд 13
![try { ... } catch (Overflow) { ... } catch (MathErr) { ... }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-12.jpg)
try
{ ... }
catch (Overflow)
{ ... }
catch (MathErr)
{ ...
}
Слайд 14
![try { ... } catch (MathErr) { if (...) ... else { ... throw; } }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-13.jpg)
try
{ ... }
catch (MathErr)
{ if (...)
...
else
{
...
throw;
}
}
Слайд 15
![try { // Делаем что-то } catch (...) { // Обработка всех исключений }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-14.jpg)
try
{ // Делаем что-то }
catch (...)
{ // Обработка
всех исключений }
Слайд 16
![try { } catch (std::ios_base::failure) { } catch (std::exception) { } catch (...) { }](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-15.jpg)
try
{ }
catch (std::ios_base::failure)
{ }
catch (std::exception)
{ }
catch (...)
{
}
Слайд 17
![class Vector { ... public: class Size { ... };](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-16.jpg)
class Vector
{ ...
public:
class Size { ... };
Vector(int
n = 0);
...
};
Vector::Vector(int n)
{ if (n < 0 || n > MAX_SIZE)
throw Size();
...
}
Слайд 18
![void f(Queue q) { try { for ( ; ;](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-17.jpg)
void f(Queue q)
{ try
{ for ( ; ; )
{ int x = q.Get();
...
}
}
catch (Queue::Empty)
{ return; }
}
Слайд 19
![int f(int n) throw (ex1, ex2); int g(int n); int h(int n) throw();](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-18.jpg)
int f(int n) throw (ex1, ex2);
int g(int n);
int h(int n) throw();
Слайд 20
![class Stack; class StackEmpty { private: Stack *stack; public: StackEmpty(Stack](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-19.jpg)
class Stack;
class StackEmpty
{ private:
Stack *stack;
public:
StackEmpty(Stack *p) :
stack(p) { }
Stack* GetPtr() { return stack; }
};
class StackFull
{ private:
Stack *stack;
int n;
public:
StackFull(Stack *p, int i) : stack(p), n(i) { }
Stack* GetPtr() { return stack; }
int GetValue() { return n; }
};
Слайд 21
![class Stack { private: enum { SIZE = 100 };](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-20.jpg)
class Stack
{ private:
enum { SIZE = 100 };
int
stack[SIZE];
int *cur;
public:
Stack() { cur = stack; }
~Stack() { }
int Push(int n);
int Pop();
int IsEmpty() const { return cur == stack; }
int operator >> (int& s) { s = Pop(); return s; }
int operator << (int s) { return Push(s); }
};
Слайд 22
![int Stack::Push(int n) { if (cur - stack { *cur++](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-21.jpg)
int Stack::Push(int n)
{ if (cur - stack < SIZE)
{
*cur++ = n; return n; }
else
throw StackFull(this, n);
}
int Stack::Pop()
{ if (cur != stack)
return *--cur;
else
throw StackEmpty(this);
}
Слайд 23
![void main() { Stack s; int n; try { s](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/249416/slide-22.jpg)
void main()
{ Stack s;
int n;
try
{ s << 1;
s << 2;
s << 3;
s << 4;
s << 5;
s >> n;
printf("%d\n", n);
s >> n;
printf("%d\n", n);
s >> n;
printf("%d\n", n);
s >> n;
printf("%d\n", n);
}