Что произойдет, если выброшенное значение соответствует нескольким предложениям catch?

Буквально, что происходит, если одно выброшенное значение соответствует нескольким предложениям 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

Я получаю ошибку выше.

Что это значит?

1

Решение

От 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;
}
1

Другие решения

Я думаю, что ваша ошибка происходит из ваших 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();
}
0

По вопросам рекламы [email protected]