Как сделать так, чтобы обработка исключений проходила через несколько блоков catch в одном случае? - PullRequest
6 голосов
/ 16 апреля 2011

Допустим, у вас есть следующая иерархия. У вас есть базовый класс Animal с кучей подклассов, таких как Cat, Mouse, Dog и т. Д.

Теперь у нас есть следующий сценарий:

void ftn()
{
   throw Dog();
}

int main()
{
   try
   {
       ftn();
   }
   catch(Dog &d)
   {
    //some dog specific code
   }
   catch(Cat &c)
   {
    //some cat specific code
   }
   catch(Animal &a)
   {
    //some generic animal code that I want all exceptions to also run
   }
}

Итак, я хочу, чтобы, даже если собака была брошена, я хотел, чтобы выполнялся случай с собакой, а также - с животным. Как ты это делаешь?

Ответы [ 2 ]

9 голосов
/ 16 апреля 2011

Другая альтернатива (кроме попытки внутри попытки) состоит в том, чтобы изолировать ваш общий код обработки животных в функции, которая вызывается из любых блоков catch, которые вы хотите:

void handle(Animal const & a)
{
   // ...
}

int main()
{
   try
   {
      ftn();
   }
   catch(Dog &d)
   {
      // some dog-specific code
      handle(d);
   }
   // ...
   catch(Animal &a)
   {
      handle(a);
   }
}
7 голосов
/ 16 апреля 2011

AFAIK, вам нужно разделить это на два блока try-catch и rethrow:

void ftn(){
   throw Dog();
}

int main(){
   try{
     try{
       ftn();
     }catch(Dog &d){
      //some dog specific code
      throw; // rethrows the current exception
     }catch(Cat &c){
      //some cat specific code
      throw; // rethrows the current exception
     }
   }catch(Animal &a){
    //some generic animal code that I want all exceptions to also run
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...