Для студентов згиа специальности 080403 ”Программное обеспечение




НазваниеДля студентов згиа специальности 080403 ”Программное обеспечение
страница12/34
Дата публикации25.02.2013
Размер3.71 Mb.
ТипМетодическое пособие
uchebilka.ru > Информатика > Методическое пособие
1   ...   8   9   10   11   12   13   14   15   ...   34
^

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

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


Исключением называется событие, которое произошло во время выполнения программы, в результате совершения которого дальнейшее нормальное выполнение программы становится невозможным. Как правило, такие события являются ошибками в программе. Поэтому для дальнейшей работы приложения требуется или восстановление программы в рабочее состояние, или ее аварийное завершение с освобождением всех захваченных программой ресурсов [5].

В операционных системах Windows для этой цели предназначен механизм структурной обработки исключений (structured exception handling, SEH). Смысл механизма структурной обработки исключений заключается в следующем. В программе выделяется блок программного кода, в котором может произойти исключение. Такой блок кода называется фреймом, а сам код называется охраняемым кодом. Затем, после фрейма вставляется программный блок, который обрабатывает происшедшее исключение. Этот блок называется обработчиком исключения. После обработки исключения управление передается первой инструкции, следующей за обработчиком исключения.

Очевидно, что для того чтобы использовать этот механизм в программе, в язык программирования С++ нужно ввести новые ключевые слова. Такими ключевыми словами являются __try и __except, которые расширяют список стандартных ключевых слов языка программирования С++ и различаются только компилятором фирмы Microsoft. Ключевое слово __try отмечает фрейм, а ключевое слово __except отмечает обработчик исключения. В результате фрагмент программы, который использует механизм структурно обработки исключений, выглядит следующим образом:

_try

{

// охраняемый код

}

except (выражение-фильтр)

{

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

}

Здесь выражение-фильтр является выражением языка программирования С++ и указывает на то, как должна выполняться программа после обработки исключения. Вычисление этого выражения выполняется сразу после возникновения исключения и должно давать в результате одно из следующих значений:

  • ЕХСЕРТION_EXECUTE_HANDLER — управление передается обработчику исключений;

  • EXCEPTION_CONTINUE_SEARCH — система продолжает поиск обработчика исключения;

  • EXCEPTION_CONTINUE_EXECUTION — система передает управление в точку прерывания программы.

Сделаем два важных замечания относительно механизма структурной обработки исключений. Во-первых, не допускается использование оператора goto для передачи управления внутрь фрейма или обработчика исключения. Во-вторых, в выражении фильтра допускается использование функций GetExceptionCode и GetExceptionInformation, которые предоставляют информацию о происшедшем исключении.

Отметим также, что переменные, объявленные внутри фрейма или блока обработки исключения, являются локальными и видны только внутри соответствующего блока, как это и принято в языке программирования С++.

Рассмотрим, в листинге 2.9, программу, в которой происходит исключение при попытке обращения к памяти по адресу, который не инициализирован. Так как значение выражения-фильтра равно EXCEPTION_EXECUTE_HANDLER, то управление передается обработчику исключений, который выводит на консоль сообщение об исключении и инициализирует этот указатель. После этого программа выводит на консоль нужное значение числа и заканчивает свое выполнение.

^ Листинг 2.9 Обработка исключения

#include

#include

int main()

{

int а = 10;

int *р = NULL; // пустой указатель на целое число

__try {

cout <<"а = " << *р << endl; // ошибка, так как р = NULL

}

except(EXCEPTION_EXECUTE_HANDLER)

{

cout <<"There was some exception." <
p = &a;

}

cout << "a = " <<*p << endl; // нормально

return 0;

}

Концептуально механизм структурной обработки исключений в Windows немного отличается от механизма обработки исключений, принятого в языке программирования С++. Дело в том, что механизм структурной обработки исключений был разработан раньше, чем принят стандарт языка С++. Кроме того, в отличие от языка программирования С++ механизм структурной обработки исключений ориентирован не только на обработку программных исключений, но и на обработку аппаратных исключений. В SEH исключение рассматривается как ошибка, происшедшая при выполнении программы. В языке программирования С++ используется более абстрактный подход и исключение рассматривается как объект произвольного типа, который может выбросить программа, используя оператор throw. В свою очередь обработчик исключения catch может рассматриваться как функция с одним параметром, которая выполняется только в том случае, если тип ее параметра соответствует типу выброшенного исключения.
^ Получение кода исключения

Получить код происшедшего исключения можно при помощи функции GetExceptionCode, которая имеет следующий прототип:

DWORD GetExceptionCode(VOID);

Функция GetExceptionCode возвращает одно из следующих значений:

  • EXCEPTION_ACCESS_VIOLATION — попытка чтения или записи в виртуальную память без соответствующего права доступа;

  • EXCEPTION_BREAKPOINT — встретилась точка останова;

  • EXCEPTION_DATATYPE_MISALIGNMENT — доступ к данным, адрес которых не выровнен по границе слова или двойного слова;

  • EXCEPTION_SINGLE_STEP — механизм трассировки программы сообщает, что выполнена одна инструкция;

  • EXCEPTION_ARRAY_BIUNDS_EXCEEDED — выход за пределы массива, если аппаратное обеспечение поддерживает такую проверку;

  • EXCEPTION_FLT_DENORMAL_OPERAND — один из операндов с плавающей точкой является ненормализованным;

  • EXCEPTION_FLT_DIVIDE_BY_ZERO — попытка деления на ноль в операции с плавающей точкой;

  • EXCEPTION_FLT_INEXACT_RESULT — результат операции с плавающей точкой не может быть точно представлен десятичной дробью;

  • ЕХСЕPTION_FLT_INVALID_OРERATION — ошибка в операции с плавающей точкой, для которой не предусмотрены другие коды исключения;

  • EXCEPTION_FLT_OVERFLOW — при выполнении операции с плавающей точкой произошло переполнение;

  • EXCEPTION_FLT_STACK_CHECK — переполнение или выход за нижнюю границу стека при выполнении операции с плавающей точкой;

  • EXCEPTION_FLT_UNDERFLOW — результат операции с плавающей точкой является числом, которое меньше минимально возможного числа с плавающей точкой;

  • EXCEPTION_INT_DIVIDE_BY_ZERO — попытка деления на ноль в операции с целыми числами;

  • EXCEPTION_INT_OVERFLOW — при выполнении операции с целыми числами произошло переполнение;

  • EXCEPTION_PRIV_INSTRUCTION — попытка выполнения привилегированной инструкции процессора, которая недопустима в текущем режиме процессора;

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

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

^ Листинг 2.10 Проверка кода исключения в выражении-фильтре

#include

#include

int main()

{

int a = 10; int *p = NULL;

__try {

cout <<"a = " << *p <
}

__except (GetExceptionCode () == EXCEPTION_ACCESS_VIOLATION ?

^ EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)

{

cout <<"Exception access violation." << endl;

p = &a;

}

cout <<"a = " << *p << endl; // нормально

return 0;

}

Теперь приведем в листинге 2.11 программу, в которой проверка кода ис-ключения используется в обработчике исключений.

^ Листинг 2.11 Проверка кода исключения в обработчике исключений

#include

#include

int main()

{

int a = 10;

int *p = NULL; // пустой указатель на целое число

__try

{

cout <<"а = " <<*р << endl; // ошибка, так как р = NULL

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

DWORD ec = GetExceptionCode(); // получаем код исключения

if(ее == EXCEPTION_ACCESS_VIOLATION)

cout <<"Exception access violation." << endl;

else

cout <<"Some other exception." << endl;

p = &a;

}

cout « "a = " << *p << endl; // нормально

return 0;

}

1   ...   8   9   10   11   12   13   14   15   ...   34

Похожие:

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания к лабораторному практикуму для студентов згиа...
Методические указания к лабораторному практикуму для студентов згиа специальности 080403 «Программное обеспечение автоматизированных...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания для студентов специальности 080403
Згиа [8, 10] и других вузов [4]. Наиболее полно описаны курсовые, дипломные и квалификационные работы, однако большинство положений...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания к курсовой работе по дисциплине «Системное...
Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» для студентов специальности...

Для студентов згиа специальности 080403 ”Программное обеспечение iconПравила использования программного обеспечения в рамках программы...
Используя программное обеспечение вы тем самым подтверждаете свое согласие придерживаться этих правил. Если вы не согласны, не используйте...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания по выполнению лабораторных работ по курсу “
Информационные управляющие системы и технологии, 080403 – Программное обеспечение автоматизированных систем

Для студентов згиа специальности 080403 ”Программное обеспечение iconКлассификация программного обеспечения
В отличие от аппаратного обеспечения, программы, которые выполняются на нем, неосязаемы и классифицируются как программное обеспечение....

Для студентов згиа специальности 080403 ”Программное обеспечение iconКурсовая работа выполняется на основании 'Задания на курсовую работу'...
Целью курсовой работы является закрепление практических навыков самостоятельной постановки и решения задачи обработки данных с помощью...

Для студентов згиа специальности 080403 ”Программное обеспечение icon1. Классификация программного обеспечения
Назначением ЭВМ является выполнение программ. Программа содержит команды, определяющие порядок действии компьютера. Совокупность...

Для студентов згиа специальности 080403 ”Программное обеспечение iconОпорный конспект лекций по дисциплине Компьютерная графика для специальности...
Тема. Основные понятия компьютерной графики. Аппаратное и программное обеспечение

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания и задание к выполнению курсового проекта по...
Методические указания и задание к выполнению курсового проекта по дисциплине «Алгоритмическое и программное обеспечение электротехнических...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<