архив новостей сайта Мега Информатик | ||
Итоги уходящего 2010 года | ||
Уважаемые посетители от всей души поздравляю Вас с самым добрым, светлым и лучшим праздником - НОВЫМ ГОДОМ ! Пусть в наступающем году сбудутся все Ваши планы и он принесет только радости и удачи !!! С НОВЫМ 2011 ГОДОМ !!! | ||
![]() |
||
22 июня 2010 года, новый сайт Мега Информатик начал свою работу !!! Ура товарищи !!! | ||
автор: Тимонин Андрей
дата публикации на сайте Мега Информатик: 18.11.2012
Добро пожаловать в цикл моих уроков посвященных программированию.
Эта статья будет посвящена исключениям и обработке исключительных ситуаций.
В любом языке, как и в жизни, существуют правила. А если есть правила, значит должны быть и ситуации, которые выбиваются и существуют вне этих правил. Эти ситуации называются исключениями (exceptions). Именно про них и пойдет речь в этой статье.
Обратимся к теории. Для работы с исключениями используется контролируемый блок try. Чтобы сгенерировать исключение можно воспользоваться оператором trow внутри блока try или функций, вызываемых в этом блоке. После блока try размещаются один или несколько блоков обработки исключений catch. Смотрим пример.
try{
//фрагмент кода
}
сatch( Type)
{
//действия по обработке исключения типа Type
}
catch(…)
{
//действия по обработке прочих исключений исключения
}
Как все это работает? В блоке try{ } помещаем код, где может возникнуть ошибка. В блоке сatch( Type){ } - что необходимо сделать в исключительной ситуации, например сообщить пользователю, что в программе произошла ошибка по такому-то поводу.
Для рассмотрения ошибок конкретного типа использется вариант блока сatch( Type){ }. Вместо слова Type указываете конкретный тип. Смотрим пример.
сatch( int)
{
//действия по обработке исключения типа int
}
сatch(char *)
{
//действия по обработке исключения типа char
}
Если необходимо обрабатывать исключения разных типов можно написать универсальный блок сatch
catch(…)
{
//действия по обработке прочих исключений исключения
}
А теперь поговорим, что происходит, когда вызываем оператор trow.
trow Err();
При обращении к этому оператору создается копия параметра виде статического объекта, которая существует до тех пор, пока не будет обработано исключение. Ищется подходящий обработчик catch, в качестве параметра которого указано необходимое исключение. В данном случае catch (Err& ). Если такого не находится, вызывается catch(…).
Давайте попробуем написать класс исключений.
class ExceptionBase {
private:
int errorCode; //код ошибки
wchar_t *errorMessage;//текст сообщения
public: //конструктор по умолчанию
ExceptionBase() : errorCode(0) {errorMessage = L"no description"}
//конструктор копирования
ExceptionBase(ExceptionBase& eb);
//конструктор с кодом и текстом сообщения
ExceptionBase(int eC, const wchar_t *eM);
//деструктор
virtual ~ExceptionBase();
//оператор присваивания
ExceptionBase& operator=(ExceptionBase& eb);
int getErrorCode(); //получает код ошибки
const wchar_t* getErrorMessage();
operator int();
operator const wchar_t*();
};
Вот такой получился класс. Конструктор копирования и оператор присваивания нужны для передачи
объекта в оператор catch. Смотрим на реализацию.
//exception.cpp
#include “exception.h”
//конструктор копирования
ExceptionBase::ExceptionBase(ExceptionBase& eb)
{
errorCode = eb.getErrorCode();
//определяем сколько занимает наша строка
int len = wcslen(eb.getErrorMessage());
//выделяем необходимый размер памяти пула
errorMessage = new wchar_t[len + 1];
//копируем строку сообщения
wcscpy(errorMessage, eb.getErrorMessage());
}
ExceptionBase::ExceptionBase(int eC, const wchar_t *eM)
{
errorCode = eC;
int len = wcslen(eM);
errorMessage = new wchar_t[len + 1];
wcscpy(errorMessage, eM);
}
//деструктор
ExceptionBase::~ExceptionBase()
{
//освобождаем выделенную память пула
if(errorMessage != NULL)
delete [] errorMessage;
}
ExceptionBase& ExceptionBase::operator=(ExceptionBase& eb)
{
//защитимся от самоприсваивания
if(this == &eb)
return *this;
delete [] errorMessage;
//занесем новое значение кода
errorCode = eb.getErrorCode();
//сформируем новую строку сообщения
int len = wcslen(eb.getErrorMessage());
errorMessage = new wchar_t[len + 1];
wcscpy(errorMessage, eb.getErrorMessage());
return *this;
}
//получим код ошибки
int ExceptionBase::getErrorCode()
{
return errorCode;
}
//получим текст сообщения
const wchar_t* ExceptionBase::getErrorMessage()
{
return errorMessage;
}
//приводя к типу int получаем код ошибки
ExceptionBase::operator int()
{
return errorCode;
}
//приводя к типу wchar_t* получаем строку сообщения
ExceptionBase::operator const wchar_t*()
{
return errorMessage;
}
};
Вот такой код получился. Его можно использовать как базовый класс в иерархии,
но мы не будем усложнять.А лучше посмотрим как его следует использовать.
//гдето в коде
ExceptionBase err(GETDISPLAYMODEERROR,L"Не могу определить параметры дисплея");
throw err;
И дисплей тоже может не определяться :). Таким образом мы создали объект и вызвали исключение оператором throw.
А так будет выглядеть блок try
try
{
...
}
//ловим исключения, и выводим сообщения об ошибках
catch(ExceptionBase err)
{
MessageBox(NULL, (const wchar_t*)err, L"Ошибка", MB_ICONERROR);
}
catch(...)
{
MessageBox(NULL, L"Неизвестная ошибка", L"Ошибка", MB_ICONERROR);
}
На этом статью заканчиваю. Надеюсь, эта информация была вам интересна.
C уважением, Андрей.
|
||||
Быстрая и Компактная Система Управления Вашим Сайтом - megainformatic cms express files Особенности: - очень компакта и быстра в работе и развертывании сайта; - открытый исходный код на php; - быстрая и простая установка; - подробное описание возможностей; |
||||
Чтобы создать свой сайт быстро и легко - приобретите megainformatic cms express files всего за 100 рублей, получите дистрибутив, распакуйте его и скопируйте полученные файлы на свой хостинг. Ваш сайт готов к работе !!! |
||||
Для добавления новых статей на ваш сайт - достаточно выложить файл контента в нужную папку, например papers/my_paper1 | ||||
А затем добавить описание в файл data/papers.csv для этой статьи. После этого вам остается добавить ссылку на новую статью на главной странице сайта или на другой нужной странице - и пользователи смогут читать вашу новую статью. Модули поиска и карты сайта автоматически собирают информацию о добавленных статьях из файла статей. |
||||
Если возможности megainformatic cms express files, вам кажутся ограниченными и Вы хотите чего-то большего - обратите внимание на следующие продукты - |
||||
megainformatic cms e-shop | ||||
megainformatic cms e-mailer | ||||
Удачи вам в создании собственного виртуального интернет-пространства !!! | ||||