C++学习笔记----异常处理(throw、try、catch)

41 篇文章 5 订阅
订阅专栏

1.throw抛出异常

throw用于抛出异常,当函数抛出异常后该函数的运行将会终止,并将控制权转交给异常处理代码。
例子:

void ten(int *a,int size)
{
	int n=10;
	if(10>=size)
	{
		throw exception("数组越界");
	}
	else{
		cout<<a[10]<<endl;
	}
}

该程序会抛出异常,其异常类型为exception。
展开
当用throw语句抛出异常后,throw语句后面的语句将不会被执行,直到沿着调用链查找到异常处理块,否则将会导致程序的终止,在沿着调用链进行展开时,编译器将负责销毁在这个块中创建的对象,如果是类类型的对象,则会负责调用其析构函数。
析构和异常
析构函数总是会被执行的,但是函数函数中负责处理资源释放的代码可能被跳过。因此当我们在析构函数中抛出异常时,我们应该在析构函数内部对异常处理。否则可能导致资源没释放,对于资源的控制我们应该用类进行控制,且在析构函数中将其正确的释放。、
抛出局部对象
异常的处理时沿着调用链进行处理的,当退出某个块时,块内相应的资源会被释放,因此抛出指向局部对象的指针或引用将会是一种错误,同理函数返回局部对象的指针或者引用也将会是一种错误。因此抛出指针时应该保证指针指向的对象时存在的。

2.try catch捕获异常

我们用try…catch的方式进行捕获异常,把会发生异常代码或着调用放在try语句块内,在catch语句块内进行异常处理,其中catch的参数是我们要捕获的异常。

try{
	ten(a,10);//该调用会产生越界异常
}catch(exception &e)
{
	cout<<e.what()<<endl;
}catch(...)
{
	throw;
}

catch子句中的参数和函数的传参很相似,穿的引用则会改变实际的对象,如果传入的是对象则实际上改变的是一个副本。对于异常的匹配,一般是按照顺序进行匹配的,所以在书写代码时越是专门的异常处理越是要放在catch列表的前端,如果catch中存在继承的关系,我们应该将继承链底端的异常处理放置在catch的前端。

重新抛出
一条catch语句使用throw将异常传递给另一个catch语句处理,这里的throw语句不包含任何的表达式,仅是一条简单的throw语句。空的throw语句只出现在catch语句或者catch直接或间接调用的函数中。
捕获所有异常的catch

catch(...){

}

上述语句可以捕获所有的异常,通常和重新抛出语句一起使用,catch执行完成一部分工作后将其他的处理转交给其他的处理函数,当catch(…)和其他处理语句一起使用时应当把catch(…)放在catch列表的最后。
构造函数和异常
当构造函数的初始化列表发生异常时,构造函数体内的异常还未准备,因此构造函数体内的异常捕捉无法捕捉函数初始化列表产生的异常,为了捕捉函数初始化列表的异常我们需要将函数写成函数ry语句块
如下:

template <typename T>
Blob<T>::Blob(std::initializer_list<T> il)try:data(std::make_shared<std::vector<T>(il))
{
}catch(const std::bad_alloc &e){handle_out_of_memory(e);}

处理构造函数初始值唯一的方法是将构造函数写成函数try语句块。

3.noexcept关键字

noexcept关键字有两个作用,一个用于指明函数是否会抛出异常,另一个作用则是用于判断函数是否抛出异常。
声名函数不会抛出异常
具体用法如下:

void test(int) noexcept;  //该函数不会抛出异常
void test(int);//该函数可能抛出异常

如果一个函数使用了noexcept同时有抛出异常,那么编译器将会立即调用terminate将程序终止。
带有参数的noexcept

void test(int) noexcept(true);  //该函数不会抛出异常
void test(int)(false);//该函数可能抛出异常

noexcept运算符
将会返回一个bool值,如果函数返回true则表示函数不会抛出异常,否则返货false。

noexcept(test(i));//返回true表示test(i)不会抛出异常,否则返回false;
void f() noexcept(noexcept(g()));//f和g的异常说明一致

4.标准异常和自定义异常

c++标准库定义了一些标准异常,这些异常分别定义在4个头文件中:

  • exception头文件定义了最通用的异常类exception,进报告异常的发生但不提供信息。
  • stdexcept头文件定义了常用的异常,如下表:
    在这里插入图片描述- new头文件定义了bad_alloc异常类。
  • type_info定义了bad_cast异常类。

所有的标准异常都是继承自exception的,便准已成的继承体系如下:
在这里插入图片描述除了使用标准异常我们还可以使用自定义的异常,自定义异常通常继承自标准异常,其用法和捕捉方式和标准异常没有太大区别。

C++ throw
weixin_45743799的博客
03-19 8723
我们知道C++ 异常处理的流程,具体为: 抛出(Throw)--> 检测(Try) --> 捕获(Catch) 异常必须显式地抛出,才能被检测和捕获到;如果没有显式的抛出,即使有异常也检测不到。 在 C++ 中,我们使用 throw 关键字来显式地抛出异常,它的用法为: throw exceptionData; exceptionData 是“异常数据”的意思,它可以包含任意的信息...
异常的处理
weixin_39371622的博客
12-01 783
Java异常处理的五个关键字:trycatch、finally、throwthrows 2.1 抛出异常throw 在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接受参数。那么,当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。 在java中,提供了一个t...
[C++] 异常控制trycatch用法
louiceone的专栏
09-21 1056
1、基础介绍try{//程序中抛出异常throw value;}catch(valuetype v){//例外处理程序段}语法小结:throw抛出值,catch接受,当然,throw必须在“try语句块”中才有效。2、深入throw:(i)、程序接受到throw语句后就会自动调用析构器,把该域(try后的括号内)对象clean up,然后再进入catch语句(如果在循环体中就退出循环)。这种机制会
C++try-catch 结构
最新发布
weixin_44259499的博客
09-20 1437
C++编程中,异常处理是确保程序健壮性的重要机制之一。当程序运行过程中遇到不可预期的错误或异常情况时,`try-catch`结构能够有效捕获并处理这些异常,从而防止程序直接崩溃。通过在`try`块中包裹可能抛出异常的代码,并在`catch`块中处理相应的异常,程序可以优雅地应对各种错误。本文将详细介绍C++中的`try-catch`结构及其应用场景。
C++try_catch异常
lin28690的专栏
02-20 820
一、简单的例子 首先通过一个简单的例子来熟悉C++try/catch/throw: 1    #include                                 //包含头文件 2    #include 3    double fuc(double x, double y)                        //定义函数 4    { 5
c++ try catch 问题
weixin_34109408的博客
01-08 2566
以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码: 以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码: try { BYTE* pch ; pch = ( ...
C++学习笔记10 - 异常处理机制
qq_38958704的博客
04-11 993
何为异常处理 异常exception,即运行时错误 C中没有异常机制,所以运行时遇到错误只能终止程序 C++中新增了异常处理机制,允许程序在运行时拦截错误并处理,这样程序就不用终止 异常机制的一个典型案例就是:由用户输入2个数字然后相除中的除0异常 try , catch , throw 异常处理机制为什么优于出错条件判断:https://www.cnblogs.com/wkfvawl/p/10816156.html 异常和函数 throw 一个异常后,如果没有 catch,会层层向外传递,直到被 c
C++入门:掌握try-catch语句与异常处理
C++学习笔记中的try-catch语句格式是C++异常处理机制的重要组成部分。在C++中,当程序运行过程中遇到错误或异常情况,通常会抛出一个异常,这时就需要通过try-catch语句来捕获并处理这些异常,以确保程序的稳定性和...
Cpp.rar - C++学习笔记
03-23
6. **异常处理**:使用trycatchthrow进行错误处理,保证程序的健壮性。 7. **C++11及以后的新特性**:包括lambda表达式、右值引用、auto类型推导、范围for循环、强类型枚举等,让C++变得更加现代化和易用。 8....
C++学习笔记--多线程
du_qi的博客
08-26 3105
优缺点对比: 多线程开销小,但难于管理,且不能用于分布式系统; 多进程开销大,操作系统会进行一部分管理,因此用户管理就比较简单,可用于分布式; 通常多线程和多进程结合使用。 参考资料:http://edu.csdn.net/course/detail/2303/35894?auto_start=1 [TOC] 代码实例:1 最简单的多线程#include <iostream> #incl
c++ try_catch throw
zhangboyj的专栏
01-27 5419
<br />try{} catch(…){}<br />以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:try{BYTE* pch ;pch = (BYTE* )00001234 ;   //给予一个非法地址*pch = 6 ; //对非法地址赋值,会造成Access Violation 异常}catch(...){AfxMessageBox("catched") ;}<br />这段代码在de
C++异常处理的语法 try catch throw
zhengchunhao的专栏
08-03 1495
C++异常处理的语法。      关键字          1、  try      2、  catch      3、  throw      其中关键字try表示定义一个受到监控、受到保护的程序代码块;关键字catchtry遥相呼应,定义当try  block(受监控的程序块)出现异常时,错误处理的程序模块,并且每个catch  block都带一个参数(类似于函数定义时的数那样),这个
异常处理throwthrows、try-catch
wardo_l的博客
02-25 1478
Java异常处理的五个关键字trycatch、finally、throwthrows 1.抛出异常throw 在编写程序时,我们必须要考虑程序出现问题的情况。比如,在定义方法时,方法需要接收参数。那么,当调用方法使用接收到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式来告诉调用者。 在Java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢? 1.创建一个异常对象,封装一些
异常处理try-throw-catch
PL_disappear的博客
12-14 249
异常处理try-throw-catch: try-throw-catch成为异常处理的三段式。 通常,要查看的是否存在异常的代码块,我们也不确定它是否存在异常,所以给它一次尝试的机会,用try包裹待测试代码块,通常用if判断语句来发现异常,如果发现异常(如除数为0),给出throw new Exception(”argument“);的抛出异常的处理语句,计算机会立刻停下try内的代码运行,直接跳转到最近的catch语句,首先给出一个catch的例子: catch(Exception e){ System.
c++try catch
李!的博客
05-14 1150
try catch由来 当程序中出现错误时,会导致程序的崩溃,程序中断执行。当使用 try catch 块时,在try块中的程序遇到错误的时候,会被catch 捕获,跳过执行try块中的其他部分,在catch块中处理过后,继续执行之后的内容。 不会导致程序的中断退出。 写法: try { ... }catch(std::exception& e) { //其他的错误 } 自定义exception class MyException : public exceptio
C++try-catch
图像学习之旅
02-01 3261
1.try-catch-throwc++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在任何自己得到不想要的结果的时候进行中断,比如在进行数据库事务操作的时候,如果某一个语句返回SQL_ERROR则直接抛出异常,在catch块中进行事务回滚(回滚怎么理解?))。 #include <iostream> #include <exception> using namespace std; int main () { try { throw 1;
c++ try catch
种一棵树最好的时间是十年前,其次是现在
09-26 1078
C++try-catch,和Java、Javascript的异常处理,性质是不一样的 C++try-catch,只能捕获在代码中主动throw出去的错误 对于空指针,野指针,内存越界等不在预料之中的错误,是没办法捕获的 所以C++的异常机制,更多时候是为了方便处理可预见的异常,对于程序崩溃是没太大效果的 ...
写文章

热门文章

  • vim和外界的复制与粘贴 13497
  • C++入门级(超级基础)练手小项目----简单五子棋 8547
  • C++面试题合集 7494
  • gdb调试的智障错误2:Make breakpoint pending on future shared library load? (y or [n]) 7413
  • Linux执行sh脚本报错: Syntax error: Bad fd number 7356

分类专栏

  • c++学习 5篇
  • Linux 19篇
  • C++错误 4篇
  • 杂谈 5篇
  • Effective C++学习笔记 29篇
  • C++ 并发 11篇
  • More Effective C++ 4篇
  • 设计模式 3篇
  • C++ Primer学习笔记 41篇
  • boot 2篇
  • uCOS 1篇

最新评论

  • C++入门级(超级基础)练手小项目----简单五子棋

    爱吃萝卜的大白熊: 可以实现

  • vim和外界的复制与粘贴

    2301_79872098: 为什么输入不了"+P呀

  • gdb调试的智障错误2:Make breakpoint pending on future shared library load? (y or [n])

    激情澎湃的gan: 发生这种问题的原因是设置断点的函数名在源码中没有定义,说明要么是gdb写错函数名,要么源码写错函数名

  • C++入门级(超级基础)练手小项目----简单五子棋

    weixin_59062515: 初学者冒昧问一下,那个黑白棋子是如何打印出来的?

  • Linux执行sh脚本报错: Syntax error: Bad fd number

    小军要学习:

大家在看

  • 猫头虎推荐:七款值得尝试的国内AI代码助手 470
  • Adobe Illustrator(AI2024)软件下载安装 283
  • C语言链表
  • 十八、Python基础语法(元组-tuple) 306
  • 帝国CMS 内容页调用上一篇&下一篇的方法(精华汇总) 1

最新文章

  • (gdb) n Cannot find bounds of current function
  • Linux常用命令总结
  • g++ 编译,GDB调试时发生这样的问题(No debugging symbols found in xxxx)
2022年3篇
2021年116篇
2020年10篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家中庭玻璃钢雕塑漯河玻璃钢仿铜雕塑制造北京商场美陈费用金昌玻璃钢景观雕塑哪家好濮阳市玻璃钢雕塑玻璃钢雕塑公司装修陕西玻璃钢人物动物不锈钢雕塑性能可靠的玻璃钢花盆定制清远楼盘玻璃钢雕塑大型的玻璃钢雕塑商场美陈营销策划扬州小型玻璃钢花盆合肥玻璃钢坐凳雕塑策划开原小型玻璃钢雕塑玻璃钢白色雕塑深圳小鸡玻璃钢花盆安庆人物玻璃钢雕塑厂家广东玻璃钢大象雕塑阿城玻璃钢雕塑厂上饶玻璃钢座椅雕塑丽水玻璃钢卡通人物雕塑玻璃钢抽象雕塑摆件图片灵丘玻璃钢雕塑厂家百货类商场美陈儿童玻璃钢雕塑加工厂叶县玻璃钢雕塑费用商场国庆美陈加盟玻璃钢景观雕塑贵溪玻璃钢游乐场门头雕塑广东玻璃钢雕塑灯香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化