c++ try_catch throw

使用throw抛出异常


本人节选自《21天学通C++》一书
    抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:
throw 表达式;
    如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C++使用数据类型来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。
【范例20-2】处理除数为0的异常。该范例将上述除数为0的异常可以用try/catch语句来捕获异常,并使用throw语句来抛出异常,从而实现异常处理,实现代码如代码清单20-2所示。
代码清单20-2
1    #include<iostream.h>                                 //包含头文件
2    #include<stdlib.h>
3    double fuc(double x, double y)                        //定义函数
4    {
5        if(y==0)
6        {
7            throw y;                                    //除数为0,抛出异常
8        }
9        return x/y;                                    //否则返回两个数的商
10    }
11    void main()
12    {
13        double res;
14        try                                            //定义异常
15        {
16            res=fuc(2,3);
17            cout<<"The result of x/y is : "<<res<<endl;
18            res=fuc(4,0);                                //出现异常
19        }
20        catch(double)                                    //捕获并处理异常
21        {
22            cerr<<"error of dividing zero.\n";
23            exit(1);                                    //异常退出程序
24        }
25    }
【运行结果】在Visual C++中新建一个【C++ Source File】文件,输入上述的代码,编译无误后运行。
【范例解析】上述代码中,在主函数main()的第14~19行中使用了try语句定义异常,其中包含3条有可能出现异常的语句,它们为调用两个数相除的函数。在代码的第20~24行定义了异常处理,即捕获异常后执行该段代码中的语句。此外,在函数fuc()的代码5~8行通过throw语句抛出异常。

注意:一般来说,throw语句通常与try- catch或try-finally语句一起使用,可以使用throw语句显式引发异常。

c++ try_catch
 
1、基础介绍
try
{
//程序中抛出异常
throw value;
}
catch(valuetype v)
{
//例外处理程序段
}
语法小结:throw抛出值,catch接受,当然,throw必须在“try语句块”中才有效。

2、深入throw:
(i)、程序接受到throw语句后就会自动调用析构器,把该域(try后的括号内)对象clean up,然后再进
入catch语句(如果在循环体中就退出循环)。

这种机制会引起一些致命的错误,比如,当“类”有指针成员变量时(又是指针!),在 “类的构建器
”中的throw语句引起的退出,会导致这个指针所指向的对象没有被析构。这里很基础,就不深入了,提
示一下,把指针改为类就行了,比如模板类来代替指针,在模板类的内部设置一个析构函数。

(ii)、语句“throw;”抛出一个无法被捕获的异常,即使是catch(...)也不能捕捉到,这时进入终止函数
,见下catch。

3、深入catch:
一般的catch出现的形式是:
try{}
catch(except1&){}
catch(except2&){}
catch(...){} //接受所有异常
一般都写成引用(except1&),原因很简单,效率。

问题a:抛出异常,但是catch不到异常怎么办?(注意没有java类似的finally语句
在catch没有捕获到匹配的异常的时候,会调用默认的终止函数。可以调用set_terminate()来设置终止函数,参数是一个函数指针,类型是:void (*terminate)()。

到这里,可以题个问题:“没有try-catch,直接在程序中"throw;",会怎么样?”


其他一些技巧:
4、try一个函数体,形式如下
void fun(type1,type2) try----try放在函数体后
{
   函数定义
}
catch(typeX){}
这个用法的效果就相当于:
void fun()
{
   try{函数定义}
}


5、throw一个函数体,形式如下:
void fun (); // 能抛出任何类型的异常
void fun () throw(except1,except2,except3)
               // 后面括号里面是一个异常参数表,本例中只能抛出这3中异常
void fun () throw()   // 参数表为空,不能抛出异常

问题b:假设fun()中抛出了一个不在“异常参数表”中的异常,会怎么样?

答:调用set_terminate()中设定的终止函数。然而,这只是表面现象,实际上是调用默认的unexpected()函数,然而这个默认的unexpected()调用了set_terminate()中设定的终止函数。可以用set_unexpected()来设置unexpected,就像set_terminate()一样的用法,但是在设定了新的“unexpected()”之后,就不会再调用set_terminater中设定的终止函数了。

这个语法是很有用的,因为在用别人的代码时,不知道哪个地方会调用什么函数又会抛出什么异常,用一个异常参数表在申明时限制一下,很实用。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/452415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字证书和数字签名

什么是数字证书&#xff1f;由于Internet网电子商务系统技术使在网上购物的顾客能够极其方便轻松地获得商家和企业的信息,但同时也增加了对某些敏感或有价值的数据被滥用的风险. 为了保证互联网上电子交易及支付的安全性,保密性等&#xff0c;防范交易及支付过程中的欺诈行为&a…

域名劫持

转载于:https://www.cnblogs.com/xinghen1216/p/8548323.html

cesium html源码,Cesium源码的本地运行及调试

CesiumJS源码运行有两种方式&#xff1a;基于node.js运行官方下载地址&#xff1a;https://cesium.com/cesiumjs/下载解压后&#xff0c;在根目录安装依赖后&#xff0c;就可直接运行npm initnpm start如果调试代码呢&#xff0c;官方的示例都是在Sandcastle里放着&#xff0c;…

Diango博客--13.将“视图函数”类转化为“类视图”

文章目录0.思路引导1.ListView2.将 index 视图函数改写为类视图3.将 category 视图函数改写为类视图4.将 archive 视图函数改写成类视图5.将 tag 视图函数改写成类视图6.DetailView7.将DetailView视图函数改写成类视图0.思路引导 1&#xff09;在开发网站的过程中&#xff0c;…

es6之数据结构 set,WeakSet,mapWeakMap

{let list new Set();list.add(1);list.add(2);list.add(1);console.log(list); //Set(2) {1, 2} let arr[1,2,3,1,2] let list2new Set(arr); console.log(list2); //Set(3) {1, 2, 3} } Set ES6 提供了新的数据结构 Set。它类似于数组&#xff0c;但是成员的值都是唯一的&a…

关于C语言中继承和多态的实现

以下的内容综合了多篇文章&#xff0c;加上一点自己的理解而成。目的为了给自己阅读他们文章后做一个笔记。在末尾给出了这些文章的地址。 多态的实现可以采用以下几种方式&#xff1a; (1)使用 vod * (万能指针)来实现“编译时多态”。 (2)使用函数指针来实现“运行时…

边界测试

边界条件边界测试是单元测试中最后的也可能是最重要的任务。 软件常常在它的边界上失效&#xff0c;例如&#xff0c;处理n元数组的第n个元素时&#xff0c;或做到i次循环中的第i次重复时&#xff0c;往往会发生错误。 使用刚好小于、刚好等于和刚好大于最大值或最小值的数据结…

阿里云上Kubernetes集群联邦

摘要&#xff1a; kubernetes集群让您能够方便的部署管理运维容器化的应用。但是实际情况中经常遇到的一些问题&#xff0c;就是单个集群通常无法跨单个云厂商的多个Region&#xff0c;更不用说支持跨跨域不同的云厂商。这样会给企业带来一些担忧&#xff0c;如何应对可用区级别…

缺氧游戏计算机,缺氧PC最低什么配置一览 你觉得高吗

缺氧PC最低什么配置一览&#xff0c;你觉得高吗。游戏对于电脑有不同程度的要求&#xff0c;缺氧这款游戏也有着自己的配置要求&#xff0c;看看下面的缺氧PC最低什么配置一览&#xff0c;你的硬件够得上吗。缺氧最低配置&#xff1a;首先公布的是官 方配置需求&#xff0c;目前…

Diango博客--14.使用 Django 项目中的 ORM 编写伪造测试数据脚本

文章目录0.思路引导1.脚本目录结构2.使用 Faker 快速生成测试数据3.批量生成测试数据4.执行脚本5.效果展示0.思路引导 1&#xff09;为了防止博客首页展示的文章过多以及提升加载速度&#xff0c;可以对文章列表进行分页展示。 2&#xff09;不过这需要比较多的文章才能达到分…

基于Sql Server 2008的分布式数据库的实践

配置Sql Server 2008&#xff08;Win7&#xff09; 1.打开SQL server2012&#xff0c;使用windows身份登录 2.登录后&#xff0c;右键选择“属性”。左侧选择“安全性”&#xff0c;选中右侧的“SQL Server 和 Windows 身份验证模式”以启用混合登录模式 3.选择“连接”&#x…

横向技术分析C#、C++和Java优劣

本文将从技术人员的角度横向分析C#、C和Java优劣&#xff0c;其实选择Java阵营还是.NET阵营&#xff0c;大家可以根据自己的实际需要来确定。 C#诞生之日起&#xff0c;关于C#与Java之间的论战便此起彼伏&#xff0c;至今不辍。抛却Microsoft与Sun之间的恩怨与口角&#xff0c;…

软件测试中的存根程序

存根程序用来代替被测试的模块所调用的模块&#xff0c;因此存根程序也称为“虚拟子程序”&#xff0c;它利用被它代替的模块的接口&#xff0c;只做尽可能少的数据操作。

计算机网络应用云计算,计算机网络云计算的类型

原标题&#xff1a;计算机网络云计算的类型随着现代计算机网络技术的不断发展&#xff0c;越来越多的与计算机网络有关的现代化技术得以出现&#xff0c;并且有着广泛的应用&#xff0c;其中云计算技术就是比较常见的一种&#xff0c;在实际应用中发挥着较高的价值。在信息时代…

sublime_text快捷键

1、注释&#xff1a;选中文本后&#xff0c;CTRL / 2、CTRL N,CTRLS&#xff0c;保存成.html文件后&#xff0c;只需要输入感叹号&#xff01;&#xff0c;然后tab键&#xff0c;即可打印出基本的html格式&#xff01;转载于:https://www.cnblogs.com/JAVA-STUDYER/p/855040…

Diango博客--15.通过 Django Pagination 实现简单分页(一)

文章目录0.思路引导1.Paginator 类的常用方法2.用 Paginator 给文章列表分页3.在模板中设置分页导航4.效果展示0.思路引导 1&#xff09;当博客上发布的文章越来越多时&#xff0c;通常需要进行分页显示&#xff0c;以免所有的文章都堆积在一个页面&#xff0c;影响用户体验。…

SpringMVC 测试 mockMVC

SpringMVC测试框架 基于RESTful风格的SpringMVC的测试&#xff0c;我们可以测试完整的Spring MVC流程&#xff0c;即从URL请求到控制器处理&#xff0c;再到视图渲染都可以测试。 一 MockMvcBuilder MockMvcBuilder是用来构造MockMvc的构造器&#xff0c;其主要有两个实现&…

自顶向下和自底向上测试的优缺点

自顶向下测试方法的主要优点是不需要测试驱动程序&#xff0c;能够在测试阶段的早期实现并验证系统的主要功能&#xff0c;而且能在早期发现上层模块的接口错误。 自顶向下测试方法的主要缺点是需要存根程序&#xff0c;可能遇到与此相联系的测试困难&#xff0c;低层关键模块中…

C++ class中的静态(static)成员

C class中的静态(static)成员 &#xff08;1&#xff09; 静态数据成员 ①一般地静态数据成员在该类定义之外被初始化&#xff0c;如同一个成员函数被定义在类定义之外一样。在这种定义中的静态成员的名字必须被其类名限定修饰&#xff0c;例如下面是_interestRate的初始…

用计算机弹可惜不是你,可惜不是你 还是幸亏不是你

一、 你没有再挽留 我也没有再回头 就这样 无风无雨也无晴 无疾而终二、 是我孤陋寡闻不知你心有人三、 如果作业有葬礼,全体学生定当盛装出席.四、 纵使我有千般好 你也看不到 因为你没有一双爱我的眼睛五、 原来暂时共你没缘分 来年先会变得更合衬六、 真的别回头 你有未来 你…