异常不会被抓住

时间:2012-06-16 10:56:08

标签: c++ exception

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

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

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

2 个答案:

答案 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 {};

同样适用于ProductExceptionexception,假设后者为std::exception