Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
369164_46F07_otvety_na_bilety_po_oop_si.doc
Скачиваний:
44
Добавлен:
24.12.2018
Размер:
613.38 Кб
Скачать

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

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

Исключительная ситуация возникает при выполнении оператора throw . В качестве аргумента throw задается любое значение. Это может быть значение одного из встроенных типов (число, строка символов и т.п.) или объект любого определенного в программе класса.

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

Обработка исключительных ситуаций

В программе можно объявить блок, в котором мы будем отслеживать исключительные ситуации с помощью операторов try и catch :

try {

...

}catch (тип_исключительной_операции){

...

}

Если внутри блока try возникла исключительная ситуация, то она первым делом передается в оператор catch . Тип исключительной ситуации – это тип аргумента throw . Если тип исключительной ситуации совместим с типом аргумента catch , выполняется блок catch . Тип аргумента catch совместим, если он либо совпадает с типом ситуации, либо является одним из ее базовых типов. Если тип несовместим, то происходит описанный выше откат вызовов, до тех пор, пока либо не завершится программа, либо не встретится блок catch с подходящим типом аргумента.

В блоке catch происходит обработка исключительной ситуации.

Ссылка на аргумент throw передается в блок catch . Этот блок гасит исключительную ситуацию. Во время обработки в блоке catch можно создать либо ту же самую исключительную ситуацию с помощью оператора throw без аргументов, либо другую, или же не создавать никакой. В последнем случае исключительная ситуация считается погашенной, и выполнение программы продолжается после блока catch .

С одним блоком try может быть связано несколько блоков catch с разными аргументами. В этом случае исключительная ситуация последовательно "примеряется" к каждому catch до тех пор, пока аргумент не окажется совместимым. Этот блок и выполняется. Специальный вид catch

catch (...)

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

Аббревиатура SEH - это Structured exception handling. Этот механизм обработки исключений отличается от обработки исключений в С++. Он разработан специально для Windows и реализован в Visual C++. Естественно, как у каждого альтернативного метода у него есть свои плюсы и минусы. Помните мы говорили про исключения С++, что если они выбрасываются, то при обработке исключений SEH они возбуждаются. Так вот выбрасывание исключения всегда производится программным путем, а возбуждении исключения может быть программным или аппаратным. Когда возбуждается исключительная ситуация задается ее код, который можно рассматривать как тип фильтр может обрабатывать код, чтобы по разному организовать обработку. SEH предоставляет два механизма.

  • Обработку завершения termination handling

  • Обработку исключения exception handling

Общая идея обработки похожа. Код заключается в блок обработки __try, но в отличии от C++ обработки дальше может следовать один из двух блоков обработки, это либо __finaly либо __except блок. Естественно понятно, что к чему. Слово ФИНИШ даже школьники употребляют, так что __finaly понятно - все приехали. А вот взаимная вложенность допускается. Синтаксически это оформляется так:

#include "stdafx.h"

void main()

{

__try

{

}

__finally

{

}

}

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

Фильтры

Фильтрующее выражение должно принимать одно из трех значений:

EXCEPTION_EXECUTE_HANDLER

EXCEPTION_CONTINUE_SEARCH

EXCEPTION_CONTINUE_EXECUTION

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

SEH предоставляет обработчики двух типов:

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]