如果抛出的值与多个catch子句匹配会发生什么?

时间:2013-04-27 07:59:43

标签: c++ exception-handling error-handling try-catch throw

如果抛出的一个值与多个catch子句匹配,会发生什么?

编译器决定它还是会产生错误?

以下是一个示例,其中抛出一个值并匹配三个catch子句。

我编译它并得到错误。但不知道那个错误意味着什么...

    #include <iostream>
    using namespace std;

    class AAA
    {
    public:
        void ShowYou() { cout<<"AAA exception!"<<endl; }
    };

    class BBB : public AAA
    {
    public:
        void ShowYou() { cout<<"BBB exception!"<<endl; }
    };

    class CCC : public BBB
    {
    public:
        void ShowYou() { cout<<"CCC exception!"<<endl; }
    };

    void ExceptionGenerator(int expn)
    {
        if(expn==1)
            throw AAA();
        else if(expn==2)
            throw BBB();
        else
            throw CCC();
    }

    int main(void)
    {
        try
        {
            ExceptionGenerator(1);
            ExceptionGenerator(1);
            ExceptionGenerator(1);
        }

        catch(AAA& expn)
        {
            cout<<"catch(AAA& expn)"<<endl;
            expn.ShowYou();
        }   

        catch(AAA& expn)
        {
            cout<<"catch(BBB& expn)"<<endl;
            expn.ShowYou();
        }

        catch(AAA& expn)
        {
              cout<<"catch(CCC& expn)"<<endl;
              expn.ShowYou();
        }
      system("pause"); return 0;
}

错误1错误C2312:'AAA&amp;' :被'AAA&amp;'抓住在第40行

我收到上面的错误。

这是什么意思?

2 个答案:

答案 0 :(得分:1)

从n3337标准草案,15.3 / 4

  

4尝试块的处理程序按外观顺序进行尝试。这使得编写处理程序成为可能   永远不能执行,例如通过在对应的处理程序之后放置派生类的处理程序   基类。

这意味着第二个和第三个catch块基本上是无法访问的代码。尽管如此,你的程序结构良好,一致的编译器不应该拒绝它(例如我的只是发出警告)。

如果您有异常层次结构,请使它们具有多态性,以区分它们:

#include <iostream>
using namespace std;

class AAA {
public:
    virtual void ShowYou() { cout<<"AAA exception!"<<endl; }
};

class BBB : public AAA {
public:
    void ShowYou() { cout<<"BBB exception!"<<endl; }
};

class CCC : public BBB {
public:
    void ShowYou() { cout<<"CCC exception!"<<endl; }
};

void ExceptionGenerator()
{
    int expn = 0;
    cin >> expn;
    if(expn==1)
        throw AAA();
    else if(expn==2)
        throw BBB();
    else
        throw CCC();
}

int main(void)
{
    try
    {
        ExceptionGenerator();
    }
    catch(AAA& expn)
    {
        expn.ShowYou();
    }

    system("pause"); return 0;
}

答案 1 :(得分:0)

我认为你的错误来自你的3个catch块,在你的代码中你会抓住3次相同的异常类型。 在try / catch块中,您将跳转到第一个到您的异常类型的catch块。因此,为了捕获AAAA,BBBB和CCCC类型的所有情况,您必须按照推导优先级的顺序制作catch块,如下所示:

catch(CCC& expn)
{
    cout<<"catch(CCC& expn)"<<endl;
    expn.ShowYou();
}   

catch(BBB& expn)
{
    cout<<"catch(BBB& expn)"<<endl;
    expn.ShowYou();
}
catch(AAA& expn)
{
      cout<<"catch(AAA& expn)"<<endl;
      expn.ShowYou();
}