我有一个基础和派生的异常,商店的公共内部类:
//base class - ProductException
class ProductException: exception
{
protected:
const int prodNum;
public:
//default+input constructor
ProductException(const int& inputNum=0);
//destructor
~ProductException();
virtual const char* what() const throw();
};
//derived class - AddProdException
class AddProdException: ProductException
{
public:
//default+input constructor
AddProdException(const int& inputNum=0);
//destructor
~AddProdException();
//override base exception's method
virtual const char* what() const throw();
};
此函数抛出派生的异常:
void addProduct(const int& num,const string& name) throw(AddProdException);
void Store::addProduct( const int& num,const string& name )
{
//irrelevant code...
throw(AddProdException(num));
}
和一个调用该函数并尝试捕获异常的函数:
try
{
switch(op)
{
case 1:
{
cin>>num>>name;
st.addProduct(num,name);
break;
}
}
}
...
catch(Store::ProductException& e)
{
const char* errStr=e.what();
cout<<errStr;
delete[] errStr;
}
派生类应该被捕获,但我不断收到错误“未处理的异常”。有什么想法吗?谢谢!
答案 0 :(得分:4)
如果没有public
关键字,默认情况下会将继承视为private。这意味着AddProdException
不是ProductException
。像这样使用公共继承:
class AddProdException : public ProductException
{
public:
//default+input constructor
AddProdException(const int& inputNum=0);
//destructor
~AddProdException();
//override base exception's method
virtual const char* what() const throw();
};
此外,也可以在[{1}}中公开继承std::exception
,否则您将无法抓住ProductException
(或者更好,来自std::exception
)
答案 1 :(得分:4)
原因是AddProdException
不是ProductException
,因为您使用的是私有继承:
class AddProdException: ProductException {};
您需要使用公共继承:
class AddProdException: public ProductException {};
同样适用于ProductException
和exception
,假设后者为std::exception
。