类层次结构中的C ++异常处理

时间:2011-04-07 02:34:22

标签: c++ exception-handling hierarchy

在异常类的层次结构中,catch语句的正确排序是什么,以便允许捕获异常类层次结构中多个类的异常?

它最多是派生到基数还是基数到大多数派生的?

3 个答案:

答案 0 :(得分:4)

大部分派生于第一位。处理程序按它们出现的顺序进行匹配,因此您首先需要最具体的处理程序。

答案 1 :(得分:1)

我的答案是根据linux编译器,希望它应该适用于所有人。 渔获量的顺序取决于两个因素:

(1) 先来先选择 ;如果在派生之前出现基类,那么它将被选择。一些编译器警告说,有些则没有;

(2) 继承类型 ;公共或非公共(私人/受保护)

struct B {};
struct D : B {};
struct DD : D {};

int main()
{
  for(int i = 0; i < 3; i++)
  {
  try
  {
    switch(i)
    {
    case 0: throw new B;
    case 1: throw new D;
    case 2: throw new DD;
    }
  }
  catch(B *o) { cout<<"B* caught\n"; }
  catch(D *o) { cout<<"D* caught\n"; }
  catch(DD *o) { cout<<"DD* caught\n"; }
  }
}

(1)在上面的代码中,它总是捕获B.如果您通过捕获DD,D,B来更改订单,那么它将根据您的期望来获得派生类。

(2)现在将'struct'替换为'class'或将继承更改为private / protected;在上面的代码中,无论顺序如何,捕获量都与投掷类型相匹配。它将是如此严格,即使您删除任何Derived类的catch,它也不会被Base类捕获。

答案 2 :(得分:0)

正确的排序应该是最先导出的。处理程序必须按从大多数派生到基类的顺序排列 这是一个代码示例:

#include <iostream>

using namespace std;

class MyException
{
    public: 
    MyException(int value):mValue(value)
    {
    }
    int mValue;
};

class MyDerivedException: public MyException
{
    public: 
    MyDerivedException(int value, int anotherValue):MyException(value),mAnotherValue(anotherValue)
    {
    }
    int mValue;
    int mAnotherValue;
};

void doSomething()
{

    //Lot of Interesting stuff

    //Exception condition
    throw MyDerivedException(10,20);
}

int main()
{
    try
    {
        doSomething();
    }
    catch(MyDerivedException &exception)
    {
        cout<<"\nCaught Derived Class Exception\n";
    }
    catch(MyException &exception)
    {
        cout<<"\nCaught Base Class Exception\n";
    }
    return 0;
}

在上面的示例中,处理程序按Derived类(MyDerivedException)排序,然后按Base类(MyException)排序。如果这些处理程序的顺序颠倒过来,那么Base类处理程序将捕获抛出的所有异常(即使它们属于Derived类)。这是因为总是可以将Derived类对象/指针分配给Base类的对象/指针,而无需任何类型转换或显式处理。
第h