将类类型作为异常抛出

时间:2014-07-13 16:00:49

标签: c++ exception-handling

class error
{
    int x;
    int y; 
public:
    error() { }

    error(int a,int b)
    {
        x=a;
        y=b;
    }

    void display()
    {
        cout<<x<<endl<<y;
    }
};

main()
{
    error e;
    try{
        cout<<"press any key to test exception\n";
        getch();
        throw error(99,22);
    }
    catch(error e)
    {
        cout<<"\nexception caught successfully\n";
        e.display();
    }
}

throw error(99,22),该语句如何将一个类对象抛出到catch块? 如果我们写“扔e;”那么可以理解一个对象会被抛出但是“抛出错误();”将仅调用该类的构造函数,然后该代码如何工作?

1 个答案:

答案 0 :(得分:3)

您始终可以使用对构造函数的调用来为您提供临时对象。

让我们说我有一个Frac级来存储有理数。它支持+, - ,*和/ etc。

如果我想计算(1/3 + 9/4),我可以将其写为:

Frac ans = Frac(1,3) + Frac(9,4);

从函数返回对象也是如此:

Frac Frac::one() {
    return Frac(1, 1);
}

甚至抛出异常,就像你的用例一样:

throw std::logic_error("This is a call to logic_error's constructor");

在我的另一个提示时,你应该总是在C ++“by-reference”中捕获异常,如下所示:

catch (error & e) { /*...*/ }

这样做的原因是在子类重新实现异常类中的虚函数的情况下获得正确的多态行为。