Я читал о пользовательских исключений .. Это то, что я сделал.
#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;
}
Я понял, что могу бросить свои объекты класса и поймать его. Я не понимаю цель этого. Может кто-нибудь объяснить мне, зачем нам нужен класс исключений? Любые практические примеры помогут мне понять цель использования пользовательских классов исключений.
Благодарю.
Допустим, есть еще один пользователь 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 */
}
в 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;
}