C++中的异常语法

2023-05-16

文章目录

  • 概述
  • 异常的关键子
  • 自定义异常使用
  • 栈解旋
  • 异常的接口声明
  • 异常变量的生命周期
  • C++标准异常库

概述

C语言的异常缺陷在于返回值只有一个,可能出现二义性,没有统一的标准

  • C++中的异常必须有处理,如果没被处理,程序会调用terminate函数终止程序
  • 如果捕获到的异常不想处理,可以继续向上抛出 throw

异常的关键子

  • try 可能出现异常的地方写到 try中
  • throw 抛出异常
  • chtch 捕获异常
int Division(int a, int b)
{
	if(b == 0)
	{
		
		//抛出异常
		throw -1;
	}
}

void test()
{
			
	int a = 10;
	int b = 20;
	
	try
	{
		Division(a, b);
	}
	//捕获异常
	catch(int)
	{
		throw;  //不想处理可以继续向上抛出
		cout<<"异常捕获int"<<endl;
	}
	catch(...)
	{
		cout<<"其他的异常..."<<endl;
	}

}

自定义异常使用

class MyException
{	
public:
	void PrintError()
	{
		cout<<"自定义异常"<<endl;
	}	
}

int Division(int a, int b)
{
	if(b == 0)
	{
		
		//抛出异常
		throw MyException();  //匿名对象(当前行执行完成,立马被释放)
	}
}

void test()
{
			
	int a = 10;
	int b = 0;
	
	try
	{
		Division(a, b);
	}
	//捕获异常
	catch(MyException e)
	{
		e.PrintError();
	}
	catch(...)
	{
		cout<<"其他的异常..."<<endl;
	}

}

栈解旋

从try 开始起,到throw抛出异常前,栈上的数据都会被释放,释放的顺序与构造是相反的,整个过程称为栈解旋

#include <memory>

class Person
{
public:
	Person();
	~Person();
}


void test()
{

	//C++98的智能指针的使用 C11后废弃了
	auot_ptr<Person>p(new Person);
	
	//C11提供的的智能指针
	unique_ptr<Person>p2(new Person);

}

异常的接口声明

void func() throw(int)   //表示只能抛出 int类型的异常
{
	throw 1;
}


void func2() throw(intdouble)   //表示只能抛出 int和double类型的异常
{
	throw 1;
}

void func2() throw()   //表示不允许抛出异常
{
	throw 1;
}


异常变量的生命周期

class MyException
{	
public:

	MyException()
	{
		cout<<"构造函数"<<endl;
	}
	MyException(const MyException &e)
	{
		cout<<"拷贝构造"<<endl;
	}
	~MyException()
	{
		cout<<"析构函数"<<endl;
	}
}

void func()
{

	
	throw MyException();
}

void test()
{
	try
	{
		func();
	}
	catch(MyException &e)
	{
		cout<<" 自定义异常捕获"<<endl;
	}
}


C++标准异常库

异常名称描述
exception所有标准异常类的父类
bad_alloc当operator new and operator new[],请求分配内存失败时
bad_exception这是个特殊的异常,如果函数的异常抛出列表里声明了bad_exception异常,当函数内部抛出了异常抛出列表中没有的异常,这是调用的unexpected函数中若抛出异常,不论什么类型,都会被替换为bad_exception类型
bad_typeid使用typeid操作符,操作一个NULL指针,而该指针是带有虚函数的类,这时抛出bad_typeid异常
bad_cast使用dynamic_cast转换引用失败的时候
ios_base::failureio操作过程出现错误
logic_error逻辑错误,可以在运行前检测的错误
runtime_error运行时错误,仅在运行时才可以检测的错误

logic_error的子类:

异常名称描述
length_error试图生成一个超出该类型最大长度的对象时,例如vector的resize操作
domain_error参数的值域错误,主要用在数学函数中。例如使用一个负值调用只能操作非负数的函数
out_of_range超出有效范围
invalid_argument参数不合适。在标准库中,当利用string对象构造bitset时,而string中的字符不是’0’或’1’的时候,抛出该异常

runtime_error的子类:

异常名称描述
range_error计算结果超出了有意义的值域范围
overflow_erroroverflow_error 算术计算上溢
underflow_error算术计算下溢
invalid_argument参数不合适。在标准库中,当利用string对象构造bitset时,而string中的字符不是’0’或’1’的时候,抛出该异常

使用示例


#include<stdexcept>

class Person
{
public:
		Person(int age)
		{
			if(age < 0 || age > 150)
			{
			 	throw out_of_range("年龄越界!");
			}
			this->mAge = age;
		}
		
		int mAge;
}
void test()
{
	
	try
	{
		Person p(-10);
	}
	//catch(out_of_range &e)
	catch(exception &e)
	{
		cout<<e.what()<<endl;
	}


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

C++中的异常语法 的相关文章

  • 每日命令 | ls

    01 每日命令系列导语 安全行业 xff0c 接触Linux不可避免 今天我们开启Linux学习之旅 一直在构思Linux系列文章该怎么排版 xff0c 最终决定采用每日命令的形式 xff0c 毕竟Linux有大量的命令需要学习 每日命令系
  • c51单片机(预备知识)

    1 什么是单片机 单片机又称单片微控制器 它不是完成某一个逻辑功能的芯片 而是把一个计算机系统集成到一个芯片上 相当于一个微型的计算机 xff0c 和计算机相比 xff0c 单片机只缺少了I O设备 xff08 小键盘 LED显示器 xff
  • 一级指针和二级指针的传参问题(学习笔记)

    一 指针 一级指针 xff1a 是一个指针变量 xff0c 指向一个普通变量 xff0c 并保存该普通变量的地址 二级指针 xff1a 是一个指针变量 xff0c 指向一个一级指针 xff0c 并保存该一级指针的地址 二 一级指针的引用 2
  • UDP广播的实现

    一 广播的概念 广播 xff1a 由一台主机向该主机所在子网内的所有主机发送数据的方式 任何一个网段最后一个地址就是广播的地址 例如 xff1a 192 168 5 103主机发送广播信息 xff0c 那么 xff0c 广播地址为192 1
  • 必备模块知识——继电器

    一 继电器的概念 1 1 什么是继电器 继电器是一种电控制器件 xff0c 是当输入量的变化达到规定要求时 xff0c 在电气输出电路中使被控量发生预定的阶跃变化的一种电器 继电器具有控制系统和被控制系统 xff0c 通常应用于自动化的控制
  • 必备模块知识——超声波传感器

    一 超声波传感器 1 什么是超声波 人们能听到声音是由于物体振动产生的 xff0c 它的频率在20HZ 20KHZ范围内 xff0c 超过20KHZ称为超声波 xff0c 低于20HZ的称为次声波 常用的超声波频率为几十KHZ 几十MHZ
  • typedef的用法——c语言

    一 ypedef 1 1 xff1a typedef的用法 xff08 如上图所示 xff09 typedef 用法一句话总结 把定义的类型改名 举个例子 xff1a 我们熟悉的int类型 定义一个变量 xff0c 如int a xff1b
  • shell的测试语句

    一 shell的条件测试语句 在写shell脚本时 xff0c 经常遇到的问题就是判断字符串是否相等 xff0c 可能还要检查文件状态或进 行数字测试 xff0c 只有这些测试完成才能做下一步动作 1 1 shell脚本中的条件测试如下 x
  • 在miivii域控制器(基于Xavier)上复现Ultra-Fast-Lane-Detection源论文项目

    源项目链接 一 安装 参考源项目安装教程 xff0c 个别步骤有改动 xff1a 1 我没有安装Anaconda xff0c 所以跳过步骤2 2 步骤3中安装pythorch torchvision的血泪史 xff1a 网上看了很多下载py
  • shell的控制语句(3)

    shell脚本与我们所用的c语言控制语句 xff0c 是存在一些差异的 xff0c 因此 xff0c 我们需要重新认识并且学会它们 因此 xff0c 接下来 xff0c 我会介绍常用的流程控制语句 如 xff1a if for while
  • shell的函数

    一 shell函数 有些脚本段间互相重复 xff0c 如果能只写一次代码块而在任何地方都能引用那就提高了代码的可重用性 shell 允许将一组命令集或语句形成一个可用块 xff0c 这些块称为 shell 函数 二 shell函数的格式 2
  • Visual Studio 2015(C#)编写实现TCP调试助手(服务端+客户端一体)-新手

    近期在做项目的时候运用到了WIFI模块 xff0c 想着自己捣鼓捣鼓弄个上位机调试调试 初次接触 xff0c 长达3天的修修改改终于完成 xff0c 实现代码比较杂乱 xff0c 但是可以正常使用 不足之处 xff0c 还望指正 xff01
  • IDEA This is not a valid Java qualified name问题解决

    今天在创建类的时候突然出现这样的一个错误 This is not a valid Java qualified name 出现这个错误的主要原因是因为类名出现了空格 我是在类名前有一个空格
  • 双系统ubuntu18.04如何更新到22.04

    将双系统中的Ubuntu 18 04更新到22 04 xff0c 按照以下步骤操作 xff1a 1 打开终端并更新系统 xff0c 使用以下命令 xff1a span class token function sudo span span
  • 如何查看自己的ubuntu系统的镜像源,并且换源

    1 查看自己的Ubuntu系统当前使用的镜像源 xff1a 1 打开终端 xff1a 按下Ctrl 43 Alt 43 T xff0c 或者在菜单中搜索 终端 2 输入以下命令并按Enter键 xff1a span class token
  • QT项目2048游戏(C++)(附流程图、源码)

    在学校学完C语言后用easyX图形库写了一个2048游戏 xff0c 在大概学完C 43 43 后用QT改进了一下的2048游戏 游戏框图 流程图 开始界面 游戏中的界面 游戏结束界面 改进之处 1 添加了背景音乐 2 添加了结束游戏后重新
  • 用 Saleae Logic 16 示波器测量并分析 I2C、SPI、串口的信号

    文章目录 一 安装Saleae Logic 16软件二 Saleae Logic 16简单介绍1 Saleae Logic 16 逻辑分析仪2 Saleae Logic 16软件 三 三个实例1 I2C信号2 SPI信号3 串口信号 四 总
  • TCP通信—客户端与客户端的双向通信

    功能 xff1a 1 实现客户端与客户端之间的TCP双向通信 xff1b 2 服务器记录客户端实名连接 xff0c 并显示客户端数据记录 xff1b 3 客户端退出 xff0c 服务器和另一客户端显示相应提示 xff1b 服务器代码思路 x
  • xshell登录wsl

    配置ssh server 卸载 span class token function sudo span span class token function apt get span remove openssh server 安装 span

随机推荐

  • 获取form表单中的数据对象集合

    form表单中直接获取所有数据的对象集合 form表单中的数据获取方法 我们在开发中如果出现form表单 xff0c 那么肯定我们是要获取用户在表单中填写的数据 xff0c 当然如果一个个去那大每一个输入框中的数据 xff0c 也是可取的
  • JavaScript中的window.location的使用

    window location对象可以用于获取当前页面地址 xff08 url xff09 并把浏览器重定向到新页面 location对象的属性与对应的属性值 xff1a window location href 返回当前页面的href u
  • js原生实现本地图片转base64上传服务器(js,jq,html)

    这里写自定义目录标题 上传过程 xff1a htmljs 上传过程 xff1a 1 xff0c 使用input xff1a type 61 file读取本地图片 xff1b 2 xff0c 使用new FileReader 将 图片转化为b
  • AJAX异步请求原理与过程;

    AJAX异步请求原理和过程 1 AJAX创建异步对象XMLHttpRequest xff1a AJAX 的要点是 XMLHttpRequest 对象 不同的浏览器创建 XMLHttpRequest 对象的方法是有差异的 IE浏览器使用 Ac
  • vue生命周期图解(带注释)

    vue生命周期图解 xff08 带注释 xff09
  • c++ class和struct的区别是什么?

    c 43 43 class和struct的区别是什么 在c 43 43 中使用struct和class xff0c 定义类的唯一区别就是默认的访问权限 c 43 43 primer第五版 没错 c 43 43 中class和struct几乎
  • 让程序编译更优雅的几个CMake命令

    简介 本文通过一个工程示例介绍了几个让程序编译更优雅的CMake命令 文末有完整下载地址 该工程示例首先生成一个动态库 xff08 libversion dll xff1a 该库主要用于打印版本相关的信息 xff09 xff0c 然后在一个
  • Fast-Planner安装

    Fast Planner安装 Fast Planner是港科大沈老师课题组的项目 xff0c 该项目是为了实现四旋翼无人机能在复杂未知环境下快速飞行 首先到Fast Planner的github网址下 xff0c 查看README xff0
  • Windows程序设计学习笔记——Winsock和udp

    Winsock是处理网络的Windows api 使用前先包含头文件Winsock2 h以及导入静态库Ws2 32 lib include lt Winsock2 h gt pragma comment lib 34 Ws2 32 lib
  • 网络编程04-UDP的广播、组播

    目录 一 UDP广播通信 1 什么是广播 2 特点 3 广播地址 4 实现广播的过程 xff08 一定是使用UDP协议 xff09 广播发送端 广播接收方 练习1 xff1a 把广播通信进行实现 发送端 接收端 二 UDP组播 xff08
  • JSON文件的生成与解析

    参考Json文件的生成和解析
  • C++ 设置double精度

    设置double精度 在这里插入代码片 span class token macro property span class token directive keyword include span span class token str
  • GitLab 出现错误Could not resolve host: xxx-xxx

    错误原因 xff1a 域名解析错误 解决办法找 打开hosts 在最后一行添加 192 30 xxx xxx gitlab
  • TeeChart控件_动态创建

    在安装目录下找到TeeChartxxxxx ocx 以管理员的身份打开cmd 注册TeeChartxxxxx ocx regsvr32 TeeChartxxxxx ocx VS2015 使用TeeChart绘图控件 CRect rect s
  • Nginx

    Nginx 介绍 Nginx是一款轻量级的Web 服务器 反向代理服务器 电子邮件 xff08 IMAP POP3 xff09 代理服务器 xff0c 并在一个BSD like 协议下发行 由俄罗斯的程序设计师Igor Sysoev所开发
  • 上电自动开机

    上电开机启动是指电脑主机在UPS恢复供电时可以自动开机 该功能必须要求电脑主板型号支持 xff0c 进入电脑的BIOS进行设置使用 不同型号的电脑的BIOS设置会有区别 xff0c 以下仅做参考 xff1a 第一步 xff1a 开机进入BI
  • Linux网络编程【TCP】

    文章目录 TCP特点TCP中CS架构TCP状态转换相关操作函数recv函数send函数 TCP特点 TCP是一种面向广域网的通信协议 xff0c 目的是在跨越多个网络通信时 xff0c 为两个通信端点之间提供一条具有下列特点的通信方式 xf
  • 博客资源整理

    文章目录 STLLinux基础命令linux系统编程Linux网络编程Docker容器技术数据库第三方库的使用Linux编程WebQt STL 基础概念 容器 duque stack map set vector 算法 查找算法 排序算法
  • Qt编译Mysql驱动

    1找到源码 2点击编译会看到报错 1解决方案 下载相关文件 也可以私信发给你 2打开配置文件添加下面的信息 相关文件下载 3点击编译 弹出的框直接关掉就行 4在安装qt的根目录下会生成如下目录 5 找到下面的库 6 将上面的库拷贝到如下目录
  • C++中的异常语法

    文章目录 概述异常的关键子自定义异常使用栈解旋异常的接口声明异常变量的生命周期C 43 43 标准异常库 概述 C语言的异常缺陷在于返回值只有一个 xff0c 可能出现二义性 xff0c 没有统一的标准 C 43 43 中的异常必须有处理