Хелпикс

Главная

Контакты

Случайная статья





Фильтры и обработчики исключений



Фильтры и обработчики исключений

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

Общий вид обработки исключений

__try{

//защищаемый блок

}

__except (фильтр исключений)

{

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

}

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

- EXCEPTION_EXECUTE_HANDLER – выполнить блок обрабочика;

- EXCEPTION_CONTINUE_SEARCH – переход к предыдущему блоку try;

- EXCEPTION_CONTINUE_EXECUTION – возратиться на место возникновения исключения и продолжить выполнение программы.

Для порождения исключений может быть использована функция RaiseException.

void WINAPI RaiseException(

_In_ DWORD dwExceptionCode, //код исключения

_In_ DWORD dwExceptionFlags, //флаг, задающий фильтр

_In_ DWORD nNumberOfArguments, //количество аргументов

_In_ const ULONG_PTR *lpArguments //аргументы

);

Параметры могут содержать данные приложение, необходимые для прохождения фильтра.

Содержание отчета

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

- тема работы

- постановка задачи согласно варианту задания

- текст программы

- скриншоты, демонстрирующие работу программы

- выводы

Пример программы

Далее приведен пример обработки исключений и заврешений, реализованный в среде Borland C++ Builder 6 в виде приложения с графическим интерфейсом.

 

#include <vcl.h>

#pragma hdrstop

 

#include "Main.h"

#include "Math.h"

//----------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

char* create(int type)

{

if(type==0) __asm ud2;

return "Выполнено";

}

int MyFilter(int code)

{

if (code == EXCEPTION_ILLEGAL_INSTRUCTION)//Поток выполнил недопустимую инструкцию

return EXCEPTION_EXECUTE_HANDLER; //выполним обработку в блоке except

return EXCEPTION_CONTINUE_EXECUTION; //не выполнять обработку

}

TForm1 *Form1;

//----------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

   : TForm(Owner)

{

}

//----------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

__try{

__try

{

ShowMessage(create(Edit1->Text.ToInt()));

}

__finally {

// выполняющийся в любом случае код

ShowMessage("Финальный блок выполнен!");

}

}

__except (MyFilter(GetExceptionCode()))

{

ShowMessage("Исключение сгенерировано!");

Edit1->Text=1;

 

}

}

//----------------------------------------------------

Контрольные вопросы

  1. Что представляет собой структурная обработка исключений (structured exception handling, SEH)?
  2. Для чего служит обработчик завершения (termination handler)?
  3. Что представляет собой локальная раскрутка (local unwind)?
  4. В каких случаях выполняется блок finally? Назвать три сценария.
  5. Как и для чего используется функция
    BOOL AbnormalTermination(VOID)
  6. Что представляют собой аппаратные и программные исключения?
  7. Для чего служит обработчик исключений (exception handler)?
  8. Как используются и каково назначение следующих фильтров исключений:

- EXCEPTION_EXECUTE_HANDLER

- EXCEPTION_CONTINUE_SEARCH

- EXCEPTION_CONTINUE_EXECUTION

  1. С какой инструкции возобновляет свою работу приложение после обработки исключения?
  2. Как и для чего используются функции
    DWORD GetExceptionCode(VOID);
    LPEXCEPTION_POINTERS GetExceptionInformation(VOID);
  3. В каком случае исключение является вложенным?
  4. Как и для чего используется функция

VOID RaiseException(

DWORD dwExceptionCode,          // 31-30:severity, 29=1:user,

                       // 28=0, 27-l6:facility code, 15-0

DWORD dwExceptionFlags,        // 0, EXCEPTION_NONCONTINUABLE

DWORD nNumberOfArguments, // EXCEPTION_MAXIMUM_PARAMETERS

CONST DWORD *lpArguments

);

  1. Как и для чего используется функция

UINT SetErrorMode(

UINT uMode                     // SEM_NOGPFAULTERRORBOX

);

  1. Что происходит в случае возврата из Вашего фильтра необработанных исключений следующих идентификаторов:

- EXCEPTION_EXECUTE_HANDLER

- EXCEPTION_CONTINUE_SEARCH

- EXCEPTION_CONTINUE_EXECUTION



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.