c++:异常处理机制

2023-10-29

什么是异常?

(1)异常是一种程序控制机制,与函数机制独立和互补。
      函数是一种以栈结构展开的上下函数衔接的程序控制系统;而异常是另一种控制结构,它依附于栈结构,却可以同时设置多         个异常类型作为网捕条件,从而以类型匹配在栈机制中跳跃回馈。

异常的设计目的?

(1)栈机制是一种高度节律性控制机制,面向对象编程却要求对象之间有方向、有目的的控制传动。
         从一开始,异常就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题,而不是仅为了进行错误处理。
        异常设计出来之后,却发现在错误处理方面获得了最大的好处。

异常的基本语法?

抛掷异常的程序段:                                                               |                          捕获并处理异常的程序段:    

void fun()                                                                               |                          try

{                                                                                              |                          {

       .........                                                                                |                                  复合语句

       throw    表达式;                                                             |                           }

       .........                                                                                |                           catch(异常类型声明)

}                                                                                               |                           {复合语句}

                                                                                                |                           catch(类型  (形参) )

                                                                                                |                            {复合语句}

                                                                                                |                             .......... 

异常处理思想?

(1)C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。

(2)异常是专门针对抽象编程中的一系列错误处理的。C++中不能借助函数机制,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理的特征却是遇到错误信息就想要转到若干级之上进行重新尝试。

(3)异常超脱于函数机制,决定了其对函数的跨越式回跳。

(4)异常跨越函数。

异常的接口声明:

(1)为了加强程序的可读性,可以在函数声明中列出可能抛出的所有异常类型。

int Div(int x,int y) throw(int,char);      //可以抛出int、char类型异常

(2)如果在函数声明中没有包含异常接口声明,则次函数可以抛掷任何类型的异常

int Div(int x,int y);             //可以抛出任何类型异常

(3)一个不抛掷任何类型异常的函数可以声明为:

int Div(int x,int y) throw();     //不可以抛出异常

(4) 如果一个函数抛出了它的异常接口声明所不允许抛出的异常,unexpected函数会被调用,该函数默认行为调用terminate函数中止程序。

异常的层次结构:

举例:

设计一个数组类MyArray,重载[ ]操作。

数组初始化,对数组的个数进行有效检查:

1、index<0,抛出异常eNegative

2、index=0,抛出异常eZero

3、index>1000,抛出异常eTooBig

4、index<10,抛出异常eTooSmall

5、eSize类是以上类的父类,实现有参构造函数,并定义virtual void printErr() 输出错误。

#include<iostream>
using namespace std;

class MyArray
{
private:
	int m_len;
	int *m_data;
public:
	MyArray(int l);
	~MyArray();
	
	int &operator [](int index)               //对[]进行重载
	{
		return m_data[index];
	}
	
	int Getlength()                        
	{
		return m_len;
	}
	
	class eSize                               //父类
	{  
	protected:
		const char *ErrMsg;
	public:	
		eSize(char *msg) : ErrMsg(msg)
		{
			
		}
		
		virtual void printErr() = 0;          //虚函数
	};
	
	class eNegative : public eSize
	{
	public:
		eNegative() : eSize("Negative Exception")
		{
			
		}
		
		void printErr()
		{
			cout<< ErrMsg <<endl;
		}
	};
	
	class eZero : public eSize
	{
	public:
		eZero() : eSize("Zero Exception")
		{
			
		}
		
		void printErr()
		{
			cout<< ErrMsg <<endl;
		}
	};
	
	class eTooSmall : public eSize
	{
	public:
		eTooSmall() : eSize("TooSmall Exception")
		{
			
		}
		
		void printErr()
		{
			cout<< ErrMsg <<endl;
		}
	};
	
	class eTooBig : public eSize
	{
	public:
		eTooBig() : eSize("TooBig Exception")
		{
			
		}
		
		void printErr()
		{
			cout<< ErrMsg <<endl;
		}
	};
};

MyArray::MyArray(int l)
{
	m_len = l;
	
	if(m_len < 0)
	{
		throw eNegative();              //抛出异常
	}
	else if(m_len == 0)
	{
		throw eZero();
	}
	else if(m_len > 0 && m_len <= 10)
	{
		throw eTooSmall();
	}
	else if(m_len > 1000)
	{
		throw eTooBig();
	}
	
	m_data = new int[m_len];
}

MyArray::~MyArray()                      //析构函数
{
	if(m_data != NULL)
	{
		delete[] m_data;                   
	}
}

int main()
{
	try
	{
		MyArray a(1);                     //改变数值  可以输出不同的结果
		
		for(int i=0; i<a.Getlength(); i++)
		{
			a[i] = i;
		}
	}
	catch (MyArray::eNegative &e)          //异常捕捉处理
	{
		e.printErr();
	}
	catch (MyArray::eZero &e)
	{
		e.printErr();
	}
	catch (MyArray::eTooSmall &e)
	{
		e.printErr();
	}
	catch (MyArray::eTooBig &e)
	{
		e.printErr();
	}
	
	return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++:异常处理机制 的相关文章

  • 极品开源工具,高糊照片有救了~

    今天给大家安利一款非常好用的AI图片修复工具 甭管你是模糊不清的老照片 还是高糊的表头包 头像 它统统都能帮你变成高清 效果那是嘎嘎攒劲 用过都说好 Upscayl 电脑 软件已在Github开源 版本齐全 Windows MacOS Li
  • 图的深度优先遍历

    深度优先搜素 Depth First Search DFS 是最常见的图的搜索之一 深度优先搜索沿着一条路径一直搜索下去 在无法搜索时 返回到刚刚访问的节点 深度优先的特征是 后被访问的节点 其领接点先被访问 根据深度优先遍历的特征 后来者
  • OSPF 详细总结。陆续更新

    OSPF 1 什么是OSPF OSPF 开放式最短路径优先 是一个基于链路状态进行路由计算的动态路由协议 主要用于大中型网络 2 OSPF的特点 不仅可以在一台路由器上运行多种OSPF路由进程 还可以把一个AS 自治系统 划分成多个不通的A
  • Java设计一个学生类Student,包含的属性有name和年龄age

    由学生类派生出本科生类Undergraduate和研究生类Postgraduate 本科生类包含的属性由专业specialty 研究生包含的属性有研究方向studydirection 重写Student类中的displayInformati
  • 安装Google Blockly Developer Tools离线版

    1 Blockly Developer Tools Demo在线版 https blockly demo appspot com static demos toolbox index html 注意 国内可能被墙导致该网址访问不了 可按如下
  • 物联网LoRa系列-18:LoRa终端Sx1262芯片内部高频电信号到中频电信号的变换(混频和变频)

    我们已经拆解了天线是如何发送和接收空中的高频无线电磁波信号 拆解了无线终端如何对射频前端的高频电信号进行进一步处理的 还拆解了无线终端的发送和接收如何分时复用天线的半双工模式 我们还拆解无线终端是如何对高频射频电信号进行进一步的处理 包括发
  • linux kvm 的虚拟机处于暂停状态怎么开机 和 KVM-Virsh指令

    root ok home virsh list Id Name State 1 13svn running 2 14git running 3 12c running 4 15samba running 5 win7
  • 地信

    准备 用的是qgis desktop 3 12 0 官网上下载即可 打开后页面 语言要修改成中文 setting option第一栏 算土地利用类型 双击新建项目 在浏览界面寻找双击打开自己要处理的数据 显示在图层中 图层可以上下拖动调整显
  • IT校招指南——超实用

    http blog csdn net liuqiyao 01 article details 26567237
  • JAVA方法(函数)的概念

    JAVA中函数的概念 什么是函数 答 函数英文称function 单一或相关联功能用来实现指定 要求功能的代码块 就是函数 函数在项目组可以直接进行调用且实现独立的功能 应对不同的实现需求的各种实现方法 就被称为函数 但主函数只有一个 主函
  • C语言Link_List简单实现

    C语言Link List简单实现 不做线程控制 Link List h 作者 代浩然 时间 2017 8 2 该文件定义为非线性链表相关的实现 线性链表的特性 1 在内存中的存放地址是非连续的 随机分配 优点 1 由于地址的非连续性 所以我
  • servlet注解 @WebListener

    Servlet3 0中的监听器跟之前2 5的差别不大 唯一的区别就是增加了对注解的支持 在3 0以前我们的监听器配置都是需要配置在web xml文件中的 在3 0中我们有了更多的选择 之前在web xml文件中配置的方式还是可以的 同时我们
  • C++程序设计初步和函数

    什么是基于过程的编程 定义 基于过程的程序设计反映的是事务在计算机中的实现方式 需要把实际中的步骤依次用程序编写出来 并给问题设计合适的数据结构 基于过程的思想由两部分组成 对数据的描述 即数据结构 数据相当于问题对象在计算机中的表述 对操
  • 5.Mybatis-plus_乐观锁和悲观锁

    乐观锁 故名思意十分乐观 它总是认为不会出现问题 无论干什么不去上锁 如果出现了问题 再次更新值测试 悲观锁 故名思意十分悲观 它总是认为总是出现问题 无论干什么都会上锁 再去操作 乐观锁实现方式 取出记录时 获取当前 version 更新
  • Javascript基本语法,a-href、img-src、button按钮使用时的跳转问题

    1 在中进行显示 2 对于返回值的问题 需要使用到alart 函数 其也存在return
  • HBase技术介绍

    HBase简介 HBase Hadoop Database 是一个高可靠性 高性能 面向列 可伸缩的分布式存储系统 利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群 HBase是Google Bigtable的开源实
  • 剑指Offer面试题5:替换空格程序调试与错误解决方法

    1 问题描述 面试题5 替换空格 题目 请实现一个函数 把字符串中的每个空格替换成 20 例如输入 We are happy 则输出 We 20are 20happy 2 程序代码 Copyright c 2016 Harry HeAll

随机推荐

  • 正确使用箭头函数——什么时候不该用ES6箭头函数

    正确使用箭头函数 什么时候不该用ES6箭头函数 原文地址 https segmentfault com a 1190000007074846 与君共勉 再牛逼的梦想 也抵不住傻逼般的坚持
  • Digital Camera Sensor 曝光三要素

    曝光三要素 曝光参数包括三要素 也就是相机曝光三角 相机孔径 ISO speed 曝光时间 相机孔径 光圈 控制通光面积 影响景深 光圈的面积越大 那么f指数越小 光圈的面积和F指数呈反比 F指数是焦距和光圈的反比 their light
  • 【JUC】Java并发编程学习笔记

    一 概述 1 为什么jdk中有那么多关于并发的类 并发可以理解为多线程同时工作 一般情况下是要比单线程处理速度更快 但是并发也不是在任何情况下都更优 使用多线程并发技术编写的代码在运行时可能会 发生线程上下文切换 上下文切换指的是内核在CP
  • 【华为OD技术面试真题精选 - 技术面】- Java八股文全题库(7)

    华为OD面试真题精选 强烈推荐 华为OD技术面试真题精选 大家好 今天我给大家推荐一份备受赞誉的华为OD技术面试精选题目 所有题目均为华为od实际面试过程中出现的问题 这些面试题主要涉及到编程八股文 职业态度以及独特的个性特点 让我们一起深
  • 云上社群系统部分接口设计详解与测试

    目录 一 项目简介 1 使用统一返回格式 全局错误信息定义处理前后端交互时的返回结果 2 使用 ControllerAdvice ExceptionHandler实现全局异常处理 3 使用拦截器实现用户登录校验 4 使用MybatisGen
  • Hadoop中Mapreduce的Job任务提交流程源码解析

    一 源码解析步骤 1 设置断点 在Driver的job任务提交打上断点进行Debug调试进入其中 F7 进入 F8 下一步 Alt Shift F7 强制进入 Shift F8 退出 进入waitForCompletion 2 submit
  • FastStone Capture 注册码

    name 用户名 92626key 注册码 HZKZBZLZ BOYHXDGD ONWD
  • Windows 10 Python 深度学习环境安装

    Windows 10 Python 深度学习环境安装 详细步骤和过程如下所示 1 安装Anaconda https repo anaconda com archive https repo anaconda com archive Anac
  • 晶体管放大、饱和、截止状态判断

    NPN晶体管 晶体管导通电压为Ube 直接测量 测得晶体管EBC极电压分别为Ue Ub Uc 若基极与发射极电势差小于导通电压 Ub Ue
  • 华为认证

    由于笔试考试系统升级 将会影响中国大陆区域2023年9月25日及之后的笔试考试预约 具体影响如下 1 2023年9月25日 27日预约 改期 取消笔试考试的考生 将会同时收到邮件和短信通知 9月28日07 00及之后预约 改期 取消笔试考试
  • photo.php,EasyPhoto.php

    class EasyPhoto 所有图层 private layers array 当前活动图层 private ActiveLayer 对象实例 单实例模式 private static instance private imageLay
  • flutter解决多个类名重名问题

    Try using as prefix for one of the import directives or hiding the name from all but one of the imports Flutter遇到这种错误 意思
  • CSS3带小图标垂直下拉菜单

    在线演示 本地下载 转载于 https www cnblogs com qixidi p 10061730 html
  • List1_Excise

    List和Set集合的上层接口是 A java util Map B java util Collection C java util List D java util Set ArrayList类的底层数据结构是 A A 数组结构 B 链
  • 输入函数input

    目录 函数介绍 基本使用 返回值类型转换 函数介绍 作用 接收来自用户的输入 返回值类型 同输入值类型 即str 值的存储 使用赋值符号 即对输入值进行存储 基本使用 变量 input 输入的提示语 name input 你的名字是什么 p
  • Node.js开发框架Express.js做一个简单的Web应用以及代码详解

    目录 Express js的主要特性 搭建 Node js 开发环境 Express js的使用方法 端口和URL的定义和作用 Express js的应用场景 注意 后续技术分享 第一时间更新 以及更多更及时的技术资讯和学习技术资料 将在公
  • [Python人工智能] 十二.循环神经网络RNN和LSTM原理详解及TensorFlow编写RNN分类案例

    从本专栏开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇讲解了TensorFlow如何保存变量和神经网络参数 通过Saver保存神经网络 再通过Restore调用训练好的神经网络 本文将详细讲解循环神经网络RN
  • 开源Go语言数值算法库 An open numerical library purely based on Go programming language

    目录 关于 goNum https github com chfenger goNum 安装环境 安装方法 算法 许可证书 致谢 关于goNum goNum是一款完全以Go语言为基础的开源数值算法库 它可以使你像调用其它go函数一样使用其进
  • 使用CSS实现国际象棋棋盘

    系列文章目录 CSS3实现半透明边框 1 CSS3实现多重边框 2 CSS3如何调整背景图片大小 3 CSS3背景定位 4 CSS3设置条纹背景 5 使用CSS实现国际象棋棋盘 系列文章目录 前言 一 直角三角形 拼成正方形 二 使用步骤
  • c++:异常处理机制

    什么是异常 1 异常是一种程序控制机制 与函数机制独立和互补 函数是一种以栈结构展开的上下函数衔接的程序控制系统 而异常是另一种控制结构 它依附于栈结构 却可以同时设置多 个异常类型作为网捕条件 从而以类型匹配在栈机制中跳跃回馈 异常的设计