c++异常处理机制

c++异常处理机制

C++异常处理机制是一个用来有效地处理运行错误的非常强大且灵活的工具,它提供了更多的弹性、安全性和稳固性,克服了传统方法所带来的问题.

异常的抛出和处理主要使用了以下三个关键字: try、 throw 、 catch 。

抛出异常即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:
throw 表达式;
如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处 理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C++使用数据类型来区分不同的异常,因此在判断异常时,throw语 句中的表达式的值就没有实际意义,而表达式的类型就特别重要。

try-catch语句形式如下 :


try
{
        包含可能抛出异常的语句;
}
catch(类型名 [形参名]) // 捕获特定类型的异常
{

}
catch(类型名 [形参名]) // 捕获特定类型的异常
{

}
catch(...)    // 
三个点则表示捕获所有类型的异常
{
}



【范例1】处理除数为0的异常。该范例将上述除数为0的异常可以用try/catch语句来捕获异常,并使用throw语句来抛出异常,从而实现异常处理,实现代码如代码清单1-1所示。
// 代码清单1-1

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)             //捕获并处理异常 【throw y的类型为double,捕获的类型为double】
21                {
22                        cerr<<"error of dividing zero./n";
23                        exit(1);                //异常退出程序
24                }
25        }


【范例2】自定义异常类型 (在本文开始的代码中已经给出示范)

三、异常的接口声明

为了加强程序的可读性,使函数的用户能够方便地知道所使用的函数会抛出哪些异常,可以在函数的声明中列出这个函数可能抛出的所有异常类型,例如:

void fun() throw( A,B,C,D);

这表明函数fun()可能并且只可能抛出类型(A,B,C,D)及其子类型的异常。

如果在函数的声明中没有包括异常的接口声明,则此函数可以抛出任何类型的异常,例如:

void fun();


一个不会抛出任何类型异常的函数可以进行如下形式的声明:

void fun() thow();

      
五、异常处理中需要注意的问题

1. 如果抛出的异常一直没有函数捕获(catch),则会一直上传到c++运行系统那里,导致整个程序的终止

2. 一般在异常抛出后资源可以正常被释放,但注意如果在类的构造函数中抛出异常,系统是不会调用它的析构函数的,处理方法是:如果在构造函数中要抛出异常,则在抛出前要记得删除申请的资源。

3. 
异常处理仅仅通过类型而不是通过值来匹配的,所以catch块的参数可以没有参数名称,只需要参数类型。

4. 函数原型中的异常说明要与实现中的异常说明一致,否则容易引起异常冲突。

5. 应该在throw语句后写上异常对象时,throw先通过Copy构造函数构造一个新对象,再把该新对象传递给 catch. 


那么当异常抛出后新对象如何释放?

异常处理机制保证:异常抛出的新对象并非创建在函数栈上,而是创建在专用的异常栈上,因此它才可以跨接多个函数而传递到上层,否则在栈清空的过程中就会被 销毁。所有从try到throw语句之间构造起来的对象的析构函数将被自动调用。但如果一直上溯到main函数后还没有找到匹配的catch块,那么系统 调用terminate()终止整个程序,这种情况下不能保证所有局部对象会被正确地销毁。

6. catch块的参数推荐采用地址传递而不是值传递,不仅可以提高效率,还可以利用对象的多态性。另外,派生类的异常扑获要放到父类异常扑获的前面,否则,派生类的异常无法被扑获。

7. 编写异常说明时,要确保派生类成员函数的异常说明和基类成员函数的异常说明一致,即派生类改写的虚函数的异常说明至少要和对应的基类虚函数的异常说明相同,甚至更加严格,更特殊。

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

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

相关文章

html标签api,html5新增标签+API介绍

新增标签1、embedembed标签是html5新增的标签&#xff0c;用来嵌入内容&#xff0c;比如插件等&#xff0c;常用于视频文件的播放(为外部应用程序定义容器)。这篇文章介绍了embed的常用属性&#xff0c;基本都是定义播放器的一些设置的&#xff0c;自动播放loop、开始时间start…

UVA10404

1 //题意&#xff1a;S 和 O 二人玩游戏 。N颗石头&#xff0c;M个数&#xff0c;每次拿 M[i]个石头&#xff08;i>0 && i<m) ,谁拿到最后一个谁赢。 2 3 // 定义f[i]为还剩i颗石头时的胜负情况 &#xff0c;若S胜利&#xff0c;则记 1 &#xff0c;4 #include&…

java中定义一个CloneUtil 工具类

其实所有的java对象都可以具备克隆能力&#xff0c;只是因为在基础类Object中被设定成了一个保留方法&#xff08;protected),要想真正拥有克隆的能力&#xff0c; 就需要实现Cloneable接口&#xff0c;重写clone方法。通过克隆方法得到的对象是一个本地的副本。 1、实现Clonea…

C++异常以及错误处理

计算机应用程序中离不开错误处理&#xff0c;尤其是生产型大型软件系统。应用软件系统运行属于循环处理事务&#xff0c;出错后需要保证不能让软件程序直接退出。这就需要使用一定的程序容错处理来应对。一般情况下&#xff0c;大型软件开发中的软件系统容错处理会结合异常处理…

家用台式计算机的额定功率,台式机的功率(台式电脑电源功率多大才合适?)...

台式机的功率(台式电脑电源功率多大才合适&#xff1f;)组装一台电脑&#xff0c;我们需要先挑选好硬件&#xff0c;搭配硬件最关键点就是CPU和主板兼容性&#xff0c;硬件之间的均衡性、电源功率等&#xff0c;均需要考虑周到。那么台式电脑电源功率多大才合适&#xff1f;下面…

关于angularjs input上传图片前获取图片的Size 浅析

首先我们需要一个指令来追踪input的change。ngChage不适用input[file]。 app.directive("fileread", [function () { return { scope: { selectedFile: "", changed: & }, link: function(scope, element, attributes) { element.bind("change&qu…

CountDownLacth详解

一个同步辅助类&#xff0c;在完成一组正在其他线程中执行的操作之前&#xff0c;它允许一个或多个线程一直等待。 用给定的计数 初始化 CounDownLatch。由于调用了countDown() 方法&#xff0c;所以在当前计数到达零之前,await()方法会一直受阻塞。之后&#xff0c;会释放所有…

怎么用计算机画正弦函数图像,几何画板如何绘制正弦函数图象

考虑到三角函数问题描点的实际困难&#xff0c;教材表述时借助正弦线利用几何法利用三角函数线作正弦函数图象&#xff0c;但由此带来的困难是如何实现这种效果。如果能让三角函数线动起来&#xff0c;那将会更加直观易懂。几何画板作为使用专业的几何绘图软件&#xff0c;自带…

C/C++常见指针错误 and 内存访问越界

1) 内存分配未成功&#xff0c;却使用了它。 编程新手常犯这种错误&#xff0c;因为他们没有意识到内存分配会不成功。常用解决办法是&#xff0c;在使用内存之前检查指针是否为NULL。如果指针p是函数的参数&#xff0c;那么在函数的入口处用assert(p!NULL)进行检查。如果是用m…

C#将dll打包到程序中

直接进入主题 先来看一个栗子,假设现在有一个第三方dll namespace TestLibrary1 {public class Test{public void Point(){Console.WriteLine("aaabbbccc");}} } TestLibrary1.dll在项目中引用,然后调用其中的方法Test,将输出aaabbbccc using System;namespace Conso…

Exchange 2016集成ADRMS系列-12:域内outlook 2010客户端测试

接下来&#xff0c;我们来到域内安装了office 2010的机器上进行测试。 首先我们在客户端上强制刷新组策略&#xff0c;把我们刚才设置的策略刷新下来。 然后我们可以运行gpresult /h result.html来看看策略是不是已经下来了。 策略下来之后&#xff0c;我们打开客户端上面的out…

如何用css和HTML结合画熊,结合伪元素实现的纯CSS3高级图形绘制

自小编上次整理了一些基础图形的绘制方法之后&#xff0c;大家都纷纷表示对css3的绘图技巧学习很有帮助。虽说万变不离其宗&#xff0c;再复杂的图形也可以用最简单的三角形或者圆弧组合出来&#xff0c;但仍有不少朋友反映&#xff0c;学会基本图形也不懂得怎样组合&#xff0…

基于C++中常见内存错误的总结

在系统开发过程中出现的bug相对而言是比较好解决的&#xff0c;花费在这个上面的调试代价不是很大&#xff0c;但是在系统集成后的bug往往是难以定位的bug&#xff08;最好方式是打桩&#xff0c;通过打桩可以初步锁定出错的位置&#xff0c;如&#xff1a;进入函数前打印日志&…

UWP开发细节记录:判断文件类型

StorageFile.ContentType 属性&#xff0c;是 string 类型&#xff0c;用来表示文件内容的 MIME 类型。例如&#xff0c;音乐文件可能有 "audio/mpeg" MIME 类型。(MSDN) MIME 类型的定义可以下面的链接找到&#xff1a; MIME Types - http://blogs.msdn.com/b/jaime…

Creating Apps With Material Design —— Creating Lists and Cards

转载请注明 http://blog.csdn.net/eclipsexys 翻译自Developer Android。时间仓促&#xff0c;有翻译问题请留言指出&#xff0c;谢谢创建Lisst和Cards在你的应用程序创建复杂的清单&#xff0c;并与材料设计风格卡。您能够使用RecyclerView和CardView部件。 创建RecyclerView …

计算机考研自命题院校双非,计算机考研408——951211院校汇总

众所周知&#xff0c;计算机考研408计算机学科基础综合难度与一些顶尖985自命题相比也是不落下风的&#xff0c;号称最难工科专业课(请忽略912这种殿堂级别的)&#xff0c;难度大、知识点庞杂也是前些年众多高校纷纷脱离408统考的原因。19年的计算机类考研火到爆炸&#xff0c;…

Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

第一次鼓捣Docker&#xff0c;- - ! 报错&#xff1a; serverubuntu1987:~$ sudo apt-get update E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/ 转载于:https://www.cnblo…

新手学Struts(一)----JSP+Servlet讲解MVC实现原理

MVC基本原理一个简单的例子改良的例子Struts基本流程的实现最近在学SSH&#xff08;Struts HibernateSpring)&#xff0c;这也算是一个比较经典的框架了&#xff0c;之前都是看人家大牛说这个框架&#xff0c;那个框架&#xff0c;说的真溜&#xff0c;自己也是佩服的五体投地啊…

中国首台千万亿次超级计算机,中国首台千万亿次超级计算机首批设备开始试用...

新华社天津&#xff11;月&#xff11;&#xff13;日电(记者 周润健 罗捷)记者&#xff11;&#xff13;日从国家超级计算天津中心获悉&#xff0c;中国首台千万亿次超级计算机“天河一号”首批设备调试工作结束&#xff0c;具备向客户提供服务的条件&#xff0c;“天河一号”…

Outlook Express 错误代码表

错误码 意义 一般 0x800C01310x800C013E 可能是 Folders.dbx 档案属性错误或损坏. 0x800CCC00 身份验证&#xff08;Authentication&#xff09;未载入 0x800CCC01 认证&#xff08;Certificate&#xff09;内容错误 0x800CCC02 认证日期错误 0x800CCC03 使用者已联机 0x800CCC…