首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类层次结构中的C++异常处理

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

Stack Overflow用户
提问于 2011-04-07 10:34:22
回答 3查看 3.9K关注 0票数 6

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

它是最基本的派生,还是最基本的派生?

EN

回答 3

Stack Overflow用户

发布于 2011-04-07 10:37:14

最先派生的。处理程序是按照它们出现的顺序进行匹配的,因此您需要首先获得最具体的处理程序。

票数 4
EN

Stack Overflow用户

发布于 2011-04-07 12:37:07

我的答案是根据linux编译器,希望这对所有人都是正确的。捕获的顺序取决于两个因素:

(1)派生优先选择;如果基类出现在之前,那么它将被给予选择。有些编译器会对此发出警告,有些则不会;

(2)私有继承类型;公有或非公有(/)

代码语言:javascript
运行
复制
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;在上面的代码中,无论顺序如何,捕获都将匹配抛出的类型。它将是如此严格,即使你移除了派生类的任何捕获,它也不会被基类捕获。

票数 1
EN

Stack Overflow用户

发布于 2011-04-07 12:25:27

正确的排序应该是派生最多的。处理程序的顺序必须是从大多数派生类到基类。

下面是一个代码示例:

代码语言:javascript
运行
复制
#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;
}

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

Hth。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5575307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档