1

我有一个基础异常和一个派生异常,存储的公共内部类:

//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;
}

派生类应该被捕获,但我不断收到错误“未处理的异常”。任何想法为什么?谢谢!

4

2 回答 2

4

如果没有public关键字,继承默认被认为是私有的。这意味着AddProdExceptionis-not a 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();
};

std::exception另外,也可以从public in继承ProductException,否则您将无法捕获std::exceptions (甚至更好, from std::runtime_error)。

于 2012-06-16T10:58:40.000 回答
4

原因是AddProdException不是 a ProductException,因为您使用的是私有继承:

class AddProdException: ProductException {};

您需要使用公共继承:

class AddProdException: public ProductException {};

这同样适用于ProductExceptionand exception,假设后者是std::exception

于 2012-06-16T10:59:26.600 回答