Custom Exception Class — Зачем нам это нужно?

Я читал о пользовательских исключений .. Это то, что я сделал.

#include <iostream>
#include <exception>
#include <stdexcept>

using namespace std;

class myBase : public exception
{
public:
myBase() {};
virtual ~myBase(void) {};
virtual const char* what() const { return "Hello, you have done a mistake"; }
};

class myDerived : public myBase
{
public:
myDerived() {};
virtual ~myDerived(void) {};
const char* what() const { return "Hello, you have done a mistake in - derived class"; }
};

int main(void)
{
try
{
throw myDerived();
}
catch (exception& e)
{
cout << e.what() << endl;
}

getchar();
return 0;
}

Я понял, что могу бросить свои объекты класса и поймать его. Я не понимаю цель этого. Может кто-нибудь объяснить мне, зачем нам нужен класс исключений? Любые практические примеры помогут мне понять цель использования пользовательских классов исключений.

Благодарю.

1

Решение

Допустим, есть еще один пользователь class что также наследует от class myBase:

class myDerived2 : public myBase {
public:
myDerived2() {}
virtual ~myDerived2() {}
};

и скажем, что у вас есть try catch пункт:

try {
myDerived  A;
myDerived2 B;
...
/* to staff with both A and B */
...
} catch (std::exception& e){
cout << e.what() << endl;
}
  • В выше try - catch пункт вы ограничиваете себя, рассматривая исключения типа myDerived а также myDerived2 идентичным образом.

  • Что делать, если вы хотите лечить броски типа myDerived а также myDerived2 по-другому?

  • Тогда вам придется определить другой try-catch пункт:


try {
myDerived  A;
myDerived2 B;
...
/* to staff with both A and B */
...
} catch (myDerived &d1) {
/* treat exception of type myDerived */
} catch (myDerived &d2) {
/* treat exception of type myDerived2 */
}
  • Из приведенного выше примера я думаю, что ясно, что определение пользовательских исключений дает программисту ценный и универсальный инструмент для работы с бросками более универсальным и специализированным способом.
1

Другие решения

в C ++ вы можете бросить любой тип, который вы хотите, вам не нужно наследовать от std::exception,
Возможность перехватывать разные типы в разных операторах catch полезна, потому что вы можете генерировать разные типы исключений для разных условий. Таким образом, вы можете правильно обрабатывать различные исключительные случаи.

в этом игрушечном примере, основанном на переменной one другое исключение выдается и обрабатывается в операторах catch.
В этом случае «строка» печатается в stdout,

#include <iostream>

using namespace std;

int main(void)
{
int one = 0;
try
{
if(one)
throw 1;
else
throw "string";
}
catch (int& i)
{
cout << i << endl;
}
catch (const char* s)
{
cout << s << endl;
}

return 0;
}
1

По вопросам рекламы [email protected]