Перейти к содержанию
Опубликовано
comment_627

Всем привет, сегодня я бы хотел вам рассказать как можно написать свой собственный класс Exception !


Поехали!


Наверное вы спросите - "Зачем нам нужен свой собственный класс Exception если есть стандартный класс std::exception который находится в пространстве имён STD. Свой класс Exception может понадобится для того, что бы ловить исключения было намного удобнее. То есть, как вы все знаете у стандартного класса std::exception есть всего лишь 1 метод, а именно метод what. И когда вы будете обрабатывать исключение, то вам может не хватить возможностей стандартного класса std::exception 


Для этого мы и будем писать свой класс Exception !


Приступим.


Для начала я создам обычный консольный проект и стандартно опишу точку входа и тд.



#include <iostream>
#include <string>
using namespace std;



int main()
{


system("pause");
return 0;

}

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



#include <iostream>
#include <string>
using namespace std;

void foo(int i)
{
if (i == -1)
{
// здесь мы будем бросать наше исключение
}

cout << i << endl;
}

int main()
{


system("pause");
return 0;

}

Готово, теперь приступим к самому классу и дальнейшей обработке исключения.



#include <iostream>
#include <string>
using namespace std;

class MyException
{
private:
string exception;
public:

MyException(string ex)
{
exception = ex;
}
string what()
{
return exception;
}
~MyException()
{
}
};

void foo(int i)
{
if (i == -1)
{
throw MyException("i было < 1");
}
cout << i << endl;
}

int main()
{
setlocale(LC_ALL, "ru");
try
{
foo(-1);
}
catch (MyException& ex)
{
cout << ex.what() << endl;
}
system("pause");
return 0;

}

Ну а вот тут я хочу сделать небольшую остановочку.


Как видите мы создали класс MyException, где в private доступе находится 1 поле типа string, в public конструктор,деструктор и сам наш метод what, так же я описал функцию где симулировал исключение ( сделано для примера ).


Давайте для начала разберём функцию, она просто выводит число которое мы передадим в неё аргументом, но например если мы передадим в эту функцию число равное -1, тогда наша функция например начнёт отрабатывать не правильно. Для этого мы бросаем исключение и уже дальше ловим его в блоке catch.


Теперь немного о классе. Т.к это самый простой пример класса Exception, то мы просто в конструкторе принимаем 1 параметр типа string,


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


Наверное вы спросите - "А чем же наш класс отличается от стандартного? Ведь у него так же есть 1 метод и всё." с одной стороны вы правы, но , что нам мешает добавить ещё методы в наш класс для того, что бы сделать его удобнее в использовании? Давайте попробуем. 



#include <iostream>
#include <string>
using namespace std;

class MyException
{
private:
string exception;
int ErrorCode;
public:

MyException(string ex)
{
exception = ex;
}

MyException(string ex,int code)
{
exception = ex;
ErrorCode = code;
}
string what()
{
return exception;
}
int code()
{
return ErrorCode;
}
~MyException()
{
}
};

void foo(int i)
{
if (i == -1)
{
throw MyException("i было < 1",1);
}
cout << i << endl;
}

int main()
{
setlocale(LC_ALL, "ru");
try
{
foo(-1);
}
catch (MyException& ex)
{
cout << ex.what() << endl;
cout << ex.code() << endl;
}
system("pause");
return 0;

}

Теперь мы имеем 2 конструктора и можем при необходимости получить код ошибки. 


Дальше вы можете создавать свои методы по необходимости, так же это намного удобнее чем мы бы писали 1 огромную строку в стандартном классе std::exception.


Рекомендуемые сообщения

Опубликовано
comment_628

 

Всем привет, сегодня я бы хотел вам рассказать как можно написать свой собственный класс Exception !

Поехали!

Наверное вы спросите - "Зачем нам нужен свой собственный класс Exception если есть стандартный класс std::exception который находится в пространстве имён STD. Свой класс Exception может понадобится для того, что бы ловить исключения было намного удобнее. То есть, как вы все знаете у стандартного класса std::exception есть всего лишь 1 метод, а именно метод what. И когда вы будете обрабатывать исключение, то вам может не хватить возможностей стандартного класса std::exception 

Для этого мы и будем писать свой класс Exception !

Приступим.

Для начала я создам обычный консольный проект и стандартно опишу точку входа и тд.

#include <iostream>
#include <string>
using namespace std; 



int main()
{

	
   system("pause");
   return 0;

}

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

#include <iostream>
#include <string>
using namespace std;

void foo(int i)
{
   if (i == -1)
   {
   // здесь мы будем бросать наше исключение
   }

   cout << i << endl;
}

int main()
{

	
  system("pause");
  return 0;

}

Готово, теперь приступим к самому классу и дальнейшей обработке исключения.

#include <iostream>
#include <string>
using namespace std;

class MyException
{
private:
	string exception;
public:

	MyException(string ex)
	{
		exception = ex;
	}
	string what()
	{
		return exception;
	}
	~MyException()
	{
	}
};

void foo(int i)
{
	if (i == -1)
	{
		throw MyException("i было < 1");
	}
	cout << i << endl;
}

int main()
{
  setlocale(LC_ALL, "ru");
  try
  {
	foo(-1);
  }
  catch (MyException& ex)
  {
    cout << ex.what() << endl;
  }
  system("pause");
  return 0;

}

Ну а вот тут я хочу сделать небольшую остановочку.

Как видите мы создали класс MyException, где в private доступе находится 1 поле типа string, в public конструктор,деструктор и сам наш метод what, так же я описал функцию где симулировал исключение ( сделано для примера ).

Давайте для начала разберём функцию, она просто выводит число которое мы передадим в неё аргументом, но например если мы передадим в эту функцию число равное -1, тогда наша функция например начнёт отрабатывать не правильно. Для этого мы бросаем исключение и уже дальше ловим его в блоке catch.

Теперь немного о классе. Т.к это самый простой пример класса Exception, то мы просто в конструкторе принимаем 1 параметр типа string,

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

Наверное вы спросите - "А чем же наш класс отличается от стандартного? Ведь у него так же есть 1 метод и всё." с одной стороны вы правы, но , что нам мешает добавить ещё методы в наш класс для того, что бы сделать его удобнее в использовании? Давайте попробуем. 

#include <iostream>
#include <string>
using namespace std;

class MyException
{
private:
	string exception;
	int ErrorCode;
public:

	MyException(string ex)
	{
		exception = ex;
	}

	MyException(string ex,int code)
	{
		exception = ex;
		ErrorCode = code;
	}
	string what()
	{
		return exception;
	}
	int code()
	{
		return ErrorCode;
	}
	~MyException()
	{
	}
};

void foo(int i)
{
	if (i == -1)
	{
		throw MyException("i было < 1",1);
	}
	cout << i << endl;
}

int main()
{
	setlocale(LC_ALL, "ru");
  try
  {
	foo(-1);
  }
  catch (MyException& ex)
  {
    cout << ex.what() << endl;
    cout << ex.code() << endl;
  }
  system("pause");
  return 0;

}

Теперь мы имеем 2 конструктора и можем при необходимости получить код ошибки. 

Дальше вы можете создавать свои методы по необходимости, так же это намного удобнее чем мы бы писали 1 огромную строку в стандартном классе std::exception.

 

Молодец.Я твой фанат :burumburum:

Продажи:


Здравствуйте!Я являюсь официальным посредником по данным читам:
1.[AltezaHack] – [Point Blank]
2.[AimNester] – [Point Blank,Warface]
3.[GlobalHack] – [CS:GO]
4.[sMARTHACK] – [CS:GO]
5.[AimJunkies] – [CS:GO,Warface,PUBG,S.T.A.L.K.E.R.GTA V и многое другое]

6.[FanHack] - [PUBG]
7.[FanHack] - [CS:GO]
8.[FanHack] - [APEX]

В России,Украине и других странах “СНГ”
У меня лучшие цены в России,Украине и остальных странах!

Мой профиль в ВК: Сергей Иванов (vk.com)
Моя группа в ВК: Буст чего то там (vk.com)
Логин Skype: doni-dakk
Отзывы покупателей: https://vk.com/topic-145854178_35682231
Telegramm:@Sedine



Покупая товары у меня,вы получаете:
* Тех.поддержку.
* Быструю активацию ключа.
* Решение ваших проблем.
* Так же,тех.поддержка с сайта.


Особенности товаров:
1.Не банят.
2.Большой функционал.
3.Поддержка.
4.Полность на Русском языке.(часть из них)

При покупке,вам гарантирована активация,скрин,о том что ваши деньги дошли по меня.

Звонки,я не принимаю!Даже не пытайтесь!

 

Гость
Эта тема закрыта для публикации ответов.