|
|||
Фильтры и обработчики исключений ⇐ ПредыдущаяСтр 3 из 3 Фильтры и обработчики исключений Обработчик исключений – это механизм, который позволяет приложениям отвечать на возможные исключительные ситуации (неправильное выполнение арифметических операций, нарушение адресации памяти). Общий вид обработки исключений __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;
} } //---------------------------------------------------- Контрольные вопросы
- EXCEPTION_EXECUTE_HANDLER - EXCEPTION_CONTINUE_SEARCH - EXCEPTION_CONTINUE_EXECUTION
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 );
UINT SetErrorMode( UINT uMode // SEM_NOGPFAULTERRORBOX );
- EXCEPTION_EXECUTE_HANDLER - EXCEPTION_CONTINUE_SEARCH - EXCEPTION_CONTINUE_EXECUTION
|
|||
|