Генерируем свои исключения. Свой класс 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
}