atch (
... )
{ ...
}
З описаних у програмі обробників завжди спрацьовує тільки один.
Ідентифікація того обробника, який потрібно викликати, здійснюється за типом викинутого значення. Решта обробники не викликаються. Можна перехоплювати будь-які типи даних, включаючи і типи створюваних користувачем класів. Фактично в якості виняткових ситуацій часто використовуються саме типи класів.
throw викидає виключення і здійснює перехід до обробника. За цим ключовим словом в загальному випадку може слідувати вираз, яке зводиться до певного типу. Це значення може розглядатися як фактичний параметр при виклику функції обробника. Типом цього операнда визначаємо який з обробників повинен перехопити виняток.
Місце, де написано слово throw, називається точкою викиду.
Ключове слово throw без операнда застосовується, коли заново викидається то виключення, яке в даний момент обробляється. Цей варіант використовується або в catch-обробнику, або у функції їм викликається.
void f1 ()
{ ...
if (<умова>)
throw "помилка";
}
void f2 ()
{ ...
if (<умова>)
{x = 3;
throw x;}
}
Коли виконується throw
1) створюється копія викинутого об'єкта;
2) "розмотується" стік, викликаючи деструктори локальних об'єктів, що виходять з області дії;
3) передається керування найближчого catch-оброблювачу, що має тип, співпадає з типом викинутого об'єкта. Копія об'єкта передається оброблювачу як параметр.
Розглянемо приклад програми, яка ілюструє роботу з графічними об'єктами. Тут реалізовані основні принципи об'єктно-орієнтованого програмування на мові C + +.
# include // директива препроцесора для роботи з графікою
# include // директива препроцесора для введення-виведення
# include // директива препроцесора для введення одиночного символу
enum Boolean {false, true};// логічний тип
class Location
{protected:
int X; int Y;// захищені поля класу
public:// відкритий блок
// Location ();// Такі конструктори без параметрів створюються компілятором. Його
// оголошувати не треба.
Location (int nx, int ny) {X = nx; Y = ny;}// Якщо функцію визначили відразу в класі, то
// це вбудована функція. Вона викликається не
// через стек, а підстановкою в програму.
int GetX () {Return X;}
int GetY () { return Y;}
};
// клас Точка
class Point: public Location
{protected:
Boolean vis;
public:
Point (int nx, int ny);// конструктор
// віртуальні функції
virtual void Show ();// функція, що реалізує відображення об'єкта на екрані
virtual void Hide ();// функція, що дозволяє приховати об'єкт
virtual void Drag (int by) ;//рух об'єкта по екрану в залежності від кроку by
Boolean Isvis () {return vis;}
void MoveTo (int nx, int ny);// перенесення точки з одного місця на екрані в інше
};
// клас Коло
class Circle: public Point
{protected:
int R;
public:
Circle (int nx, int ny, int nr);// конструктор
void Show ();// Так як клас Circle є спадкоємцем класу Point, функції
void Hide ();// Show () і Hide () також є віртуальними
void Expand (int by);// збільшення окружності
void Contract (int by) ;//зменшення окружності
};
Boolean GetDelta (int & dx, int & dy);// функція визначає яку кнопку натиснув
// користувач
Point :: Point (int nx, int ny): Location (nx, ny)
{vis = false;}
void Point :: Show ()
{vis = true; putpixel (X, Y, getcolor ());}// getcolor () повертає колір, який зараз
// встановлений
void Point :: Hide ()
{vis = false; putpixel (X, Y, getbkcolor ());}// getbkcolor () повертає колір фону
void Point :: MoveTo (int nx, int ny)
{Hide (); X = nx; Y = ny; Show ();}// точка гаситься на старому місці і відтворюється
// на новому
Boolean GetDelta (int & dx, int & dy)
{char Keych;
Boolean Quit;
dx = 0; dy = 0;
do
{Keych = getch ();
if (Keych == 13)
return (False);
if (Keych == 0)
{Quit = true;
Keych = getch ();
switch (Keych) {
case 72: dy = -1; break;
case 80: dy = 1; break;
case 75: dx = -1; break;
case 77: dx = 1; break;
default: Quit = false;};};
} while (! Quit);
return (true);}
// рух об'єкта по екрану залежно від кроку by
// Можна натискати дві кнопки одночасно, точка
// буде переміщатися відраз...