Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >类层次结构中的C++异常处理

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

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

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

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

EN

回答 3

Stack Overflow用户

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

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

票数 4
EN

Stack Overflow用户

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 04:25:27

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

下面是一个代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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

复制
相关文章
类的层次结构设计
在写程序时,我们会经常遇到如上图所示的一种情形——深层调用,ClassD1和ClassD2需要调用ClassA关联的ClassX、ClassY和ClassZ等,对于这种情况,经常见到通过构造函数一层层往下传递做法。
一见
2018/08/07
5890
类的层次结构设计
C++中异常处理的使用见解
C++内置的异常处理语法try catch用法,在某种情况下使用异常处理可以使代码更加简洁. 不使用异常的伪代码 if (file.read(userName) == 0) { processUserName(userName); if (file.read(number) == 0) { processNumber(number); } else { errorCode = ERROR_READ; } } else { err
Qt君
2019/07/15
6920
C++ 异常处理
异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。
C语言与CPP编程
2020/12/02
1.1K0
C++ 异常处理
C++异常处理
0.如果使用普通的处理方式:ASSERT,return等已经    足够简洁明了,请不要使用异常处理机制.
用户3148059
2018/09/03
1.5K1
C++异常处理
C++异常处理
异常是一个程序执行过程中出现的问题。C++ 异常是对程序运行过程中产生的例外情况作出的响应,比如试图除以零。
软件架构师Michael
2023/08/20
2560
C++异常处理
0.png 这里创建了两个对象一个在堆中动态创建temp.一个在栈中temp1。执行结果看到temp1自动被析构,而temp未被析构。c++在异常抛出后有栈解锁机制,会自动析构在栈中创建的对象。
用户2929716
2018/08/23
6430
C++异常处理
C++异常处理的开销
C++异常是C++有别于C的一大特性 ,异常处理机制给开发人员处理程序中可能出现的意外错误带来了极大的方便,但为了实现异常,编译器会引入额外的数据结构与处理机制,增加了系统的开销。天下没有免费的午餐,使用异常时我们必须了解其带来的开销和问题。
恋喵大鲤鱼
2018/08/16
1.2K0
C++异常处理的开销
C++ 异常处理的开销
C++ 异常是 C++ 有别于 C 的一大特性 ,异常处理机制给开发人员处理程序中可能出现的意外错误带来了极大的方便,但为了实现异常,编译器会引入额外的数据结构与处理机制,增加了系统的开销。天下没有免费的午餐,使用异常时我们必须了解其带来的开销和问题。
恋喵大鲤鱼
2022/12/02
8300
C++ 异常处理的开销
C++继承、虚函数、RTTI、友元类、异常处理
前面讲到c++的继承是子类在继承时声明继承的权限,之前描述有点不够准确。以下时书中提及的能继承的成员。
歪歪梯
2020/08/17
8050
警惕Python编程中异常处理结构可能的坑
所谓异常,主要是指由于测试不充分导致在实际运行时遇到意料之外的错误而引发的代码崩溃。例如让用户输入两个数然后输出两个数的商,结果用户把除数输入为0。例如让用户输入文件名然后程序输出其中的内容,结果用户输入的文件名不存在。例如网络临时发生故障导致无法连接服务器。这样的情况如果得不到及时处理都会引发代码崩溃。
Python小屋屋主
2019/05/05
6270
警惕Python编程中异常处理结构可能的坑
C++ 异常处理简介
异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。
自学气象人
2023/01/12
7550
python的中异常处理处理ZeroDivisionError异常处理 FileNotFoundError 异常异常时保持静默
Python 使用被称为 异常 的特殊对象来管理程序执行期间发生的错误。每当发生让 Python 不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 traceback ,其中包含有关异常的报告。异常是使用 try-except 代码块处理的。 try-except 代码块让 Python 执行指定的操作,同时告诉 Python 发生异常时怎么办。使用了 try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的 traceback 。
章鱼喵
2018/09/26
6.1K0
java中的异常和异常处理
Java的基本理念是“结构不佳的代码不能运行”,在我们进行编写代码的时候一般通过编译的时候就可以看出代码是否有错误,但是在这一阶段并不能处理完成所有的异常,如一些不可预知的情况,在运行期间才会暴露。所以Java中对异常做出了如下归类。
袁新栋-jeff.yuan
2020/08/26
1.9K0
java中的异常和异常处理
C++异常处理建议收藏
  异常处理基本思想:执行一个函数的过程中发现异常,可以不用再本函数内立即进行处理,而是抛出该异常,让函数的调用者直接或间接的处理这个问题。
全栈程序员站长
2022/07/14
4570
Java 中的异常处理
在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。
崔笑颜
2020/06/08
1.3K0
Java中的异常处理
Java的基本设计思想是“Badly formed code will not be run!”。这句话的大致意思是:错误形式的代码不会被运行。 我们在写代码的时候,提升错误恢复能力是提升代码健壮的重要措施。而“为了创建一个更加健壮的系统,那么每一个组件都必须是健壮的”。从而,在Java中出现了异常处理机制。 不像C语言,基本处理错误的代码都是程序员写上去的,而在Java中,除非是要自己自定义异常的时候,我们一般都是通过异常处理代码块来解决问题的。不但提高了代码的健壮性,还提高了代码的可读性。 那么,异常处理的定义是什么呢?当程序运行时出现了异常(不是错误),可能是空指针异常等等很多异常,能够对当前出现异常的代码进行处理,或是直接报告异常,或是将异常抛给特定的位置进行决断处理。 同大多数的需求一样,异常处理也被设计者设计成了一个类:Throwable。在这个类的下面,又有Error(错误)、和Exception(异常)。Error(错误)一般情况下不会通过代码进行处理,因为一般能报错误的情况,都是十分严重的情况,大多数错误都是由JVM(Java虚拟机)引起的。例如下面的代码:
roobtyan
2019/02/21
1.3K0
Java中的异常处理
Python中的异常处理
异常的处理机制 try: result = 4 / 0 except Exception as e: print('输出异常:'+str(e)) else: print("try子句没有异常,输出result结果:", result) finally: print("程序结束,无论try子句是否有异常这条语句都会被执行!") ''' 输出: 输出异常:division by zero 程序结束,无论try子句是否有异常这条语句都会被执行! ''' 首先,执行try子句
K同学啊
2019/01/22
1.5K0
Python 中的异常处理
异常的原因通常在程序本身之外。例如,不正确的输入、输入输出设备故障等。由于程序在遇到异常时会突然终止,因此可能会对系统资源(如文件)造成损害。因此,应该正确处理异常,以防止程序突然终止。
很酷的站长
2023/08/15
2360
Python 中的异常处理
SpringMVC中的异常处理
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
多凡
2019/11/01
9300
java中的异常处理
Java中的异常处理是Java程序设计的一个核心概念,异常处理能够提高程序的可靠性和稳定性。在Java中,异常是指在程序执行过程中出现的一些错误情况,比如数据格式错误、文件不存在、网络连接中断等。Java中提供了一套完善的异常处理机制,程序员可以通过捕获异常、处理异常、抛出异常等方式来处理这些异常情况。
堕落飞鸟
2023/03/31
1.1K0

相似问题

类层次结构Qt中的异常处理

13

在类层次结构中处理异常的位置

14

C++类层次结构

22

类层次结构的重复处理

14

C++:高类层次结构

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文