Буквально, что происходит, если одно выброшенное значение соответствует нескольким предложениям 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 &’: пойман’ ААА &на линии 40
Я получаю ошибку выше.
Что это значит?
От N3337 стандартная тяга, 15,3 / 4
4 Обработчики для блока try пробуются в порядке их появления. Это позволяет писать обработчики, которые
никогда не может быть выполнен, например, помещая обработчик для производного класса после обработчика для соответствующего
Базовый класс.
Это означает, что второй и третий 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;
}
Я думаю, что ваша ошибка происходит из ваших 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();
}