Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
все билеты.doc
Скачиваний:
29
Добавлен:
20.04.2019
Размер:
2.05 Mб
Скачать

Билет №3.

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

Выбрасывание исключений и их обработка

Исключение (exception) - это ситуация, которую операционная система считает ошибкой.

Когда приложение вызывает исключение, операционная система пытается уведомить это приложение об ошибке, вызвав соответствующий обработчик (если он существует). Если в приложении не предусмотрен такой обработчик, операционная система пытается решить проблему самостоятельно, часто завершая программу и отображая немногословное сообщение для пользователя: "Программа выполнила недопустимую операцию и будет закрыта".

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

структурная обработка исключений (structured exception handling, SEH) выполняется только операционной системой;

обработка исключений C++ выполняется при появлении ошибок в приложениях, созданных средствами Visual C++.

Общий синтаксис обработки исключения в C++ такой:

try { // Начало "пробного блока".

throw выражение; /* "Выбрасывание" исключения. */}

catch(тип переменная) { // Заголовок обработчика для <типа>.

тело_обработчика) [catch ...] // Возможно, обработчики других типов.

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

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

try {...}

catch(int. i) { /*Перехватывает исключения типа int.*/}

catch(char* str) { /* Перехватывает char*. */}

catch (...) { /* Перехватывает все остальное. */}

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

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

Основные макросы отладки VC++

ASSERT()

ASSERT (Подтверждение) позволяет Вам осуществлять проверку некоторых условий, которые всегда должны быть истинными. Например, если требуется, чтобы значение индекса i не выходило за границы массива, можно использовать такую конструкцию:

ASSERT (i>=0 && i<ARRAYSIZE) ,

где ARRAYSIZE - константа, определяющая количество элементов в этом массиве.

Если проверяемое условие будет нарушено, то выдается диалоговое окно с соответствующим предупреждающим сообщением. При нажатии в этом окне кнопки Retry (Повтор) осуществляется переход в режим отладки программы (если программа выполняется из среды программирования). Курсор при этом размещается на строке, где находится макрос ASSERT. Макрос assert() добавляет к программе процедуру диагностики. После выполнения, если выражение ложно (то есть, результат сравнения 0), assert() пишет информацию о вызове в поток stderr и вызывает функцию abort().

Примечание. ASSERT является макросом, а не функцией, поэтому он не заканчивается символом ";" (точка с запятой).

class CAge : public CObject

{

public:

unsigned int m_Age;

CAge(unsigned int Age) {m_Age = Age;}

};

// example for ASSERT

CAge* pcage = new CAge( 21 ); // CAge is derived from CObject.

ASSERT( pcage!= NULL )

// Terminates program only if pcage is NOT a CAge*.

VERIFY()

Макросы ASSERT() и VERIFY() очень похожи друг на друга, что часто приводит к недоразумениям. На самом деле между ними существует очень важное различие. В отладочных версиях макросы ASSERT() и VERIFY() работают одинаково. Оба макроса вычисляют выражение, переданное им в качестве аргумента, и прекращают работу программы с выводом сообщения в том случае, если это выражение оказывается равным нулю. Отличие заключается в том, что в окончательной версии макрос ASSERT() вместе с вычисляемым выражением полностью удаляется из кода. С другой стороны, выражение макроса VERIFY() остается в программе. Макрос ASSERT() предназначен для проверки состояния переменных, а VERIFY() — для проверки функций. Выражение макроса ASSERT() относится только к состоянию переменных и не является обязательной частью программы, поэтому его можно удалить из окончательной версии.

TRACE().

Другим макросом, который можно использовать при создании отладочной версии программы, является TRACE (Трассировка), который выводит отладочную информацию в окно, расположенное в нижней части экрана дисплея (вкладка Debug).

Существует несколько видов макроса TRACE: TRACE0 (или TRACE), TRACE1, TRACE2 и TRACE3. Число в имени указывает на число параметрических аргументов, следующих за строковой константой, что напоминает обычную функцию printf. Приведем примеры использования этого макроса:

TRACE ("Не создана панель инструментов!"); - пример макроса без параметрических аргументов;

TRACE1 ("Ошибка №%d\n",-1); - пример макроса с одним параметрическим аргументом;

TRACE2 ("Ошибка в файле %s, номер: %d\n", _FILE_, k); - пример макроса с двумя параметрическим аргументами.

// example for TRACE

int i = 1;

char sz[] = "one";

TRACE( "Integer = %d, String = %s\n", i, sz ); // d - Signed decimal integer

// Output: 'Integer = 1, String = one'

Cоздание пользовательского класса исключений в MFC

Для обработки исключительных ситуаций, возникающих в MFC, определен специальный класс CException.

Сам класс CException является абстрактным классом. Объекты такого класса создавать нельзя. Для обработки исключительных ситуаций, возникающих в MFC, используется классы наследованные от класса CException:

CMemoryException

При распределении оперативной памяти

CFileException

При работе с файлами

CArchiveException

Во время записи или восстановления объектов (Archive/Serialization)

CNotSupportedException

При обращении к неизвестный метод, который не поддерживается данным классом

CResourceException

Ошибка при работе с ресурсами Windows

CDaoException

Ошибка при работе с базами данных, через средства DAO

CDBException

Ошибка при работе с базами данных, через средства ODBC

COleException

Ошибка при работе OLE

COleDispatchException

Ошибка при работе OLE

CUserException

При обработке этого исключения на экране отображается сообщение, а затем вызывается исключение CException.

//Для создания пользовательского класса исключения создаем класс наследованынй от CException

Соседние файлы в предмете Системы управления