40. C++ Генерируем свои исключения. Свой класс exception

Генерируем свои исключения. Свой класс exception

Как было показано ранее для обработки исключений может использоваться базовый класс exception, но в ряде случаев требуется расширить его функционал или написать для собственного класса или типов данных, поэтому создается класс-наследник от этого базового класса:

class MyException : public exception
{
public:
    MyException(char* msg, int codeError) : exception(msg)
    {
        this->codeError=codeError;
    }
    int GetCodeerror() {return this->codeError;}
  
private:
    int codeError;
}

В конструкторе класса MyException мы вызываем конструктор базового класса (за счет этого работает метод ex.what())также дописываем конструктор класса наследника, например передаем код ошибки.

В коде программы при работе блока try catch необходимо указывать catch по мере расширения «смысла» т.е. узконаправленный класс-наследник и потом класс-родитель.
Как было рассказано ранее конструкция try catch похожа на конструкцию switch case и будет выполняться до первого совпадения.

Поскольку указатель на базовый класс является указателем на классы наследники, то при исключении например throw MyException(“ошибка доступа к данным”, 10); могут сработать обработчики исключений catch (const exception& ex) и catch (const MyException& ex) и выполнится первый обработчик исключений, указанный в программе.
Следовательно разумнее сначала использовать классы-наследники и потом базовый класс в обработке исключений.

try
{
    func();
}
catch (const MyException& ex)
{
    //обработка ошибки 1
}
catch (const exception& ex)
{
    //обработка ошибки 2
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *