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

13.3 Структурне управління виключеннями

Структурне управління виключеннями є частиною операційної системи

WINDOWS NT. Однак Borland C++дозволяє використовувати структурне управління виключеннями і в програмах, що орієнтуються на 16-бітне середовище використання. А це означає, що описаний нижче синтаксис можна використовувати в програмах під WINDOWS та DOS. Структурне управління пропонує дві можливості: кадроване управління виключеннями та завершуюче управління.

13.3.1 Використання кадрованого управління виключеннями

(_try/_except)

13.3.1.1 Синтаксис

Кадроване управління виключеннями включає в себе три моменти:

по-перше, є блок кода, який знаходиться в фігурних дужках і слідує за ключовим словом _try. Він складається з одного чи кількох операторів, які можуть прямо чи непрямо заявляти виключення, за якими слідує ключове слово _except з фільтруючим виразом в якості параметра, за яким (виразом _except ) слідує інший блок коду - блок-обробник виключення, також поміщений в фігурних дужках:

__try

{

/*тіло*/

}

__except(фільтруючий вираз)

{

/*блок-обробник виключення*/

}

13.3.1.2 Про функцію RaiseException()

Щоб заявити виключення, можна використовувати функцію

RaiseException():

void

__cdecl __far

RaiseException(

DWORD dwExeptionCode,

DWORD dwExeptionFlags,

DWORD nNumberOfArguments,

const LPWORD lpArguments);

де

dwExeptionCode - код, що ідентифікує заявлене виключення

dwExeptionFlags - показує, чи являється виключення відновлюваним. Може приймати значення EXEPTION_CONTINUABLE та

EXEPTION_NONCONTINUABLE

nNumberOfArguments - вказує кількість аргументів, що передаються в масиві lpArguments

lpArguments - адреса масиву 32-бітних аргументів

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

EXCEPTION_EXECUTE_HANDLER - управління передається на блок-обробник виключення

EXCEPTION_CONTINUE_SEARCH - управління на асоційований блок-обробник не передається. Стек розмотується і відбувається пошук іншого обробника

EXCEPTION_CONTINUE_EXECUTION - пошук припиняється і управління повертається в те місце, де було заявлене виключення

Приклад:

#include <except.h>

#include <stdio.h>

#define EXCEPTION_ERROR_CODE 0x1000L

void doSomething(void)

{

printf(“намагаємось що-небуть зробити \n”;

printf(“Увага! Виявлена помилка \n”);

printf(“Увага! Виявлена помилка \n”);

RaiseException(

EXCEPTION_ERROR_CODE,

EXCEPTION_CONTINUABLE,0,0);

}

int main()

{ try{

doSomething();

}

except (EXCEPTION_EXECUTE_HANDLER)

{

printf(“Виключення перехоплено...\n”);

return 0;

}