如何在单个案例中通过多个catch块进行异常处理?

时间:2011-04-16 00:37:55

标签: c++ inheritance exception-handling

假设您有以下层次结构。你有一个基类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
   }
}

所以,我想要的是即使投掷了一只狗,我也想要执行Dog catch案例,还要执行Animal catch案例。你是怎么做到这一点的?

2 个答案:

答案 0 :(得分:9)

另一个替代方案(除了try-within-a-try之外)是在一个从你想要的任何catch块调用的函数中隔离你的通用Animal处理代码:

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

int main()
{
   try
   {
      ftn();
   }
   catch(Dog &d)
   {
      // some dog-specific code
      handle(d);
   }
   // ...
   catch(Animal &a)
   {
      handle(a);
   }
}

答案 1 :(得分:7)

AFAIK,您需要将其拆分为两个try-catch-blocks并重新抛出:

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
   }
}