如果抛出的一个值与多个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行
我收到上面的错误。
这是什么意思?
答案 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();
}