Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

13.2.11 Робота з специфічними класами виключень

Існує кілька визначених класів, які використовуються бібліотекою С++ для повідомлень про виключення. Розглянемо класи xmsg та xalloc.

13.2.11.1 xmsg

class _EXPCLASS xmsg

{

public:

xmsg(const string _FAR &msg);

xmsg(const xmsg _FAR &msg);

~ xmsg();

const string _FAR &why() const;

void raise() throw(xmsg);

xmsg& operator=(const xmsg _FAR &src);

private:

string _FAR *str;

};

#include<iostream.h>

#include<cstring.h>

#include<except.h>

void func()

{ if {something_is_wrong)

{xmsg xx(“зареєстрована помилка”);

throw xx;

//. . .

}

int main(void)

{try

{func();

//. . .

}

catch( xmsg&msg)

{ cerr<<“виключення”<<msg.why<<endl;

return -1;

}

return 0;

}

13.2.11.2 xalloc

Стандартна операція new викидає виключення xalloc, якщо пам’ять не може бути виділена. Клас xalloc оголошується так:

class _EXPCLASS xalloc:public xmsg

{

public:

xalloc( const string _FAR &msg,size_t size);

size_t requested() const;

void raise() throw(xalloc);

private:

size_t siz;

};

Необхідно поміщувати кожен запит про виділення пам’яті в try-блок з обробником catch(xalloc&):

#include <except.h>

#include<iostream.h>

void func()

{char *p=0;

try{

p=new char[0x100];

}

catch(xalloc& xllc)

{cerr<<“перехоплено xalloc”;

}

//. . .

}

Відмітимо, що попередні версії операції new при недостачі пам’яті вертали NULL. Щоб відновити таку поведінку, можна викликати функцію set_new_handler з параметром NULL:

#include<new.h>

. . .

set_new_handler(NULL);

Використання інформації про місцезнаходження виключення

Файл EXCEPT.H визначає три глобальних змінних, які можна використовувати для отримання інформації про виключення:

_throwFileName вказівник типу char* на ім’я файла, з якого було

викинуте виключення

_throwLineNumer змінна типу unsigned з номером рядка, в якому було

викинуте виключення

_throwExceptionName вказівник на тип char* на ім’я виключення

Приклад:

#include <except.h>

#include<iostream.h>

#include<cstring.h>

voif func(void)

{

if(error_cond)

{ xmsg xx(“Тип помилки: ###”)

//. . .

throw xx;

}}

int main(void)

{

try{

func()

//. . .

}

catch{...}

cout<<“Виключення типу”

<<__throwExceptionName

<<“викинуте”

<<“рядок”

<<__throwLineNumber

<<“Файл:”

<<__throwFileName

<<endl;

return -1;

}

return 0;

}

Відмітимо, що при роботі з виключеннями необхідно встанивити відповідні опції компілятора :

-x якщо не встановлена, то компілятор не розпізнає try-блоки

-xp якщо встановлена, то є доступ до імені файла та номера рядка, де було викинуте виключення

-xd дозволяє виклик деструкторів локальних об’єктів , створених між точками throw i catch