Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чуба 12.02.2012.docx
Скачиваний:
4
Добавлен:
16.08.2019
Размер:
36.84 Кб
Скачать

Исключения генерируемые пользователем

Рассмотренное выше касалось обработки аппаратных исключений, но можно самим генерировать исключение. Например, ошибку можно считать ситуацией, которая возникает в известном месте кода, и должна немедленно обнаруживаться логикой кода. Обработку возникновения ошибки лучше всего проводить кок обработку исключения. Так блок кода , в котором может возникнуть ошибка, заключают в блоках _try , а обработку – в блок _except. В этом случае ошибки называются программными исключениями, возбудить которые можно с помощью функции.

RaiseException:

void RaiseException (

DWORD dwExceptionCode,

DWORD dwExceptionFlag,

DWORD nNumberofArguments,

LPDWORD lpArguments);

Первый параметр - это код генерируемого исключения, при определении которого необходимо придерживается формата, применяемого для стандартных кодов ошибок в WINDOWS:

31 – 30

29 28 27 – 16 15–0

Код степени тяжести

00 – успеш.

01 – информация

10– предуприждение

11 – ошибка

Кем определен

О – Microsоft

1–пользователем

значение О

Зарезервир.

Код подсистемы,

определяется

Microsоft

Код исключения,

определяется

пользователем или

Microsоft

Второй параметр обычно устанавливается в ноль либо в значение EXCEPTION_NONCONTINUABLE, т.е. определяет может ли фильтр исключений вернуть значение EXCEPTION_CONTINUE_EXECUTION в ответ на данное исключение. Если 0, то может продолжить выполнение при этом с оператора, следующего за вызовом функции RaiseException. Если не нулевое значение, то Вы сообщаете системе, что возобновление выполнения после данного исключения невозможно.

Третий и четвертый параметры позволяют передать дополнительные данные о генерируемом исключении. Обычно параметр lpArguments равен NULL, и тогда параметр nNumberofArguments игнорируется. Если четвертый параметр не равен нулю, тогда его значение указывает на массив размерностью, указанной третьим параметром. Max допустимое количество элементов массива равно 15.

Обработчики завершения

Обработчики завершения гарантируют, что блок кода(собственно обработчик) будет выполнен независимо от того, как происходит выход из контролируемого (защищенного) блока, но не может выявить исключения.

Обработчик завершения создается с помощью блока _finally и имеет следующий вид:

_try {

контролируемый(защищенный) блок

}

_finally{

обработчик завершения

}

Его структура схожа со структурой обработчика исключений, однако здесь отсутствует фильтр исключения. Обработчики завершения, подобно обработчикам исключений, дают удобный способ закрытия дескрипторов, освобождения ресурсов, восстановления масок, и другие действий по возвращению процесса в определенное состояние перед выходом из блока. Например, программа может использовать оператор return в середине кода, а обработчик завершения будет выполнять работу по очистке. Таким образом, не требуется вставлять код очистки непосредственно в блок.

Обработчик завершения выполняется каждый раз когда управление выходит из блока _try по следующим причинам:

  1. достигнут конец блока _try

  2. выполняется преждевременный выход из блока _try (операторы return, goto, break, continue)

  3. Возникновение исключения.

Отдельный блок _try должен иметь один блок _finally либо один блок _except . Оба блока сразу не допускаются. Однако можно вложить один блок в другой. Например,

_try { внешний блок try – exception

………………………………..

_try { внутренний блок try _finally

………………………………..

_try { внутренний блок try – exception

…… }

_except(EXCEPTION_EXECUTE_HANDLER) {

обработчик исключения

}

…………………………………………..

_finally {

обработчик завершения

}

}

_except (EXCEPTION_EXECUTE_HANDLER) {

………………..обработчик исключения

}

ВЫВОД

Обработки завершения и исключения позволяют сделать программу более устойчивой за счет как управления восстановления при ошибках, так и гарантии, что ресурсы и файлы будут освобождены в критических ситуациях.

ПРОГРАММА 2

I

#include <stdio.h>

#include <windows.h>

#include <string.h>

int main()

{

int a,b,Tr = 1;

float h,x,y;

HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

DWORD nOut, nlnl,nln2,nln3;

LPCSTR Mesl = new char [256],

Mes2 - new char [256],

Mes3 = new char [256];

Mesl = "Enter value A (0;10)\n";

Mes2 = "Enter value B (5;15)\n";

Mes3 = "Enter value H (0.1;0.9)\n";

nlnl = strlen(Mesl);

nln2 = strlen(Mes2);

nln3 = strlen(Mes3);

while(Tr)

_try

{

WriteConsole(hStdOut,Mesl,nlnl,&nOut, NULL);

scanf ("%i",&a);

if ( (a<0) | | (a>=10))

RaiseException(0,0,0,NULL);

else

Tr = 0;

}

_except(EXCEPTION_EXECUTE_HANDLER)

{

printf("Error enter value A!\nRepeat!!!\n");

}

Tr = 1;

while(Tr)

_try

{

WriteConsole(hStdOut,Mes2,nln2,&nOut,NULL);

scanf("%!",&b);

if ((b<5) || (b>=15))

RaiseException(OxE0000002,0,0,NULL);

else

Tr = 0;

}

_except(EXCEPTION_EXECUTE_HANDLER)

{

printf("Error enter value B!\nRepeat!!!\n");

}

Tr = 1;

while(Tr)

_try

{

WriteConsole(hStdOut,Mes,nln,&nOut,NULL);

scanf ("%f",&h);

ReadConsole(hIn, Buf, BuF,&nIn, NULL)

if ((h<0.1 || (h>=o.9))

RaiseException (OxEOOOOOOB, 0,0, NULL);

Else

Tr = 0;

}

_except(EXCEPTION_EXECUTE_HANDLER)

{

printf("Error enter value H!\nRepeat!!!\n");

}

_try

{

if (a<b)

{

printf (" x y\n\");

x = float (a);

while (x<=b)

{

y = x*x - 10;

printf("%6. If%10.2f\n",x,y);

x = x + h;

}

}

else

RaiseException(OxE0000004,0,0,NULL) ;

}

_except(EXCEPTION_EXECUTE_HANDLER)

{

printf("No posible culc, A>B\n");

}

return 0;

}