c++-基础部分-异常处理-小总结

本文详细介绍了C++中的异常处理机制,包括try、catch和throw的使用,以及异常对象的生命周期和栈解旋的过程。异常处理是程序错误处理的重要部分,当异常发生时,栈上的对象会自动析构,这一过程称为栈解旋。同时,文章讨论了不同类型的异常捕获方式,如传值与传引用,并强调了异常匹配的顺序和终止函数的调用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

清华大学出版社《c++程序设计》(第三版)中简单总结的一些知识点

  • 异常处理:
    try:将可能出错并产生异常的代码放在try块中,try块后面跟着一个或多个catch块
    catch:每个catch块捕捉和处理一种异常,如果try块有异常抛出,则程序离开try块在其后的catch块中逐个搜索合适的异常处理器。没有异常抛出,则执行所有catch块之后的语句
    throw:抛出异常

  • 异常对象的抛出与传播:
    ○ throw后面通常跟一个操作数,表示要抛出的异常。如果抛出的是一个对象(异常对象),指定捕获相应类型类型的最近的一个异常处理器捕获该异常,try块的异常处理器(catch块)紧接在try块后面。如果抛出异常,找不到类型符合的异常处理器,系统就会调用terminate函数。
    ○ terminate函数默认调用abort函数终止程序执行。
    ○ 抛出异常时,throw语句生成异常对象的一个副本,即一个临时对象,异常处理器执行完毕后删除该临时对象。
    ○ 异常对象的嵌套,异常对象先在内层try块后面catch块中寻找符合要求的异常处理器,没有则跳到外层寻找

  • 异常的捕获和处理:
    catch(参数类型 参数名)
    ○ catch(Myobj &e) 即传引用方式,e就是throw语句产生对象的引用(和上面说的副本不一样哦)
    ○ catch(Myobj e) 传值方式,将调用类的复制构造函数,用throw语句产生的对象再生成一个新对象e,此时e是抛出的异常对象的副本,如果抛出的是一个局部动态对象,则程序转到异常处理器中时,异常对象已被撤销,副本在异常处理器执行完毕后被撤销。
    ○ catch(int e) 捕捉整形异常
    ○ catch(int)能捕获到整形异常,但不能获得,但不能获得抛出的整形异常对象的大小
    ○ catch(…)能捕捉任何类型的任何异常
    ○ 没能捕捉则将调用terminate函数默认调用abort,也能使用set_terminate函数指定调用的函数
    ○ 多个异常处理器能匹配那就要看顺序了
    ○ 异常处理器参数类型和异常类型满足:类型完全一样,参数是抛出的(对象/派生类对象的指针或引用)的(基类/基类指针或引用),参数是void *抛出的是某一种类型的指针,catch(…)

  • 栈解旋(unwinding)
    异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上构造的所有对象,都会被自动析构。析构的顺序与构造的顺序相反,这-过程称为栈的解旋(unwinding)。*

  • 异常对象的生命周期:
    抛出的时候可以采用匿名对象
    ○ 普通类型元素:普通元素异常对象catch处理完之后就析构
    ○ 引用:引用的话不用调用拷贝构造,异常对象catch处理完之后就析构
    ○ 指针:直接抛出对象的取址,catch指针,这样会使得对象没有在catch处理中执行就被析构了,可以throw一个new 对象,在catch处理完过后手动清理

封面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值