c++异常处理

news2024/11/29 20:41:42

目录

1.c++异常的由来

2.怎么使用异常来解决问题

3.异常安全

4.异常规范

5.异常处理的优缺点


1.c++异常的由来

在c语言中,如果程序出现了错误,采用的是返回错误码的方式。最常见的:

int main()
{
    return 0;
}

这里的return 0的0就是表示返回正确。

我们需要进行查错误码表才可以得到是什么错误,实在太麻烦。为了解决这个问题,提出了异常的概念。


2.怎么使用异常来解决问题

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;
;

void Div(int a, int b)
{
	if (b == 0)
	throw "div false\n"; //抛出异常

	cout << (double)a / double(b) << endl;
}


int main()
{
	try
	{
		Div(2, 0);
	}
	catch (const char* s) //接受异常
	{
		cout << s << endl;
	}
    catch(...) //可以接收任意的错误信息,防止有错误信息漏跑。
    {
        cout<<"unknowed error\n"<<endl;
    }
	return 0;
}

这就是利用异常来进行检查除数是否为0的基本做法。在调用Div函数时,如果抛出了异常,就会由catch接收,并打印出错误信息。抛出的异常会先从当前的函数栈帧进行查找接收。然后再出栈帧再全局的范围顺序查找接收。

有时错误信息比较复杂,那我们就需要用指定的类来进行封装实现。同时,我们定义出来的各种错误信息的类都应该继承于同一个基类。这样我们捕捉错误信息的时候,就只需要用基类来捕获。

例如:

class Exception
{
protected:
	int _id; 
	string _ermsg;
public:
	Exception(int id,string ermsg)
		:_id(id)
		,_ermsg(ermsg)
	{}
	virtual string what() //获取错误信息
	{
		return _ermsg;
	}
};
class Sqlerror :public Exception //继承实现某个特殊的错误类
{
	string _sql_id;
public:
	Sqlerror(int id, string sql_id, string ermsg)
		:Exception(id, ermsg)
		, _sql_id(sql_id)
	{}
	virtual string what()// 添加上sql_id
	{
		string str = "exception: ";
		str += _sql_id;
		str += "->";
		str += _ermsg;
		return str;
	}
};
void sqltest() //测试出现错误的情况
{
	srand((unsigned int) time(0)); //设置随机数源
	int i = rand(); //生成随机数
	if (i % 3 == 0) //%3为0的时候表示权限不足
		throw(Sqlerror(i,"权限不足","select * from table where name=李四"));
	else if(i % 4 == 0) //%4为0的时候表示数据不存在
		throw(Sqlerror(i, "数据不存在", "select * from table where name=李四"));
}
int main()
{
	while (1) //循环测试
	{
		Sleep(1); //休眠一秒,别搞的太快了。
		try {
			sqltest();
		}
		catch (Exception& err) //以基类的引用调用子类
		{
			cout << err.what() << endl;
		}
		catch (...) //最后一道保险,捕获未知异常
		{
			cout << "unkowned error\n" << endl;
		}
	}
	

	return 0;
}

 

这样我们就可以只用一个基类引用来调用各种不同的子类,显示出不同的错误。


3.异常安全

尽量不要在构造函数或者析构函数中抛异常,这样容易导致初始化不完全或者资源释放不完全。

同时,在new和delete,在在lock和unlock之间抛出了异常也会导致问题。不过可以使用raii(智能指针)解决这个问题。


4.异常规范

直接上代码,看了就懂。

// 这里表示这个函数会抛出A/B/C/D中的某种类型的异常
void fun() throw(A,B,C,D);
// 这里表示这个函数不会抛出异常
void* operator delete (std::size_t size, void* ptr) throw();


5.异常处理的优缺点

优点:

a.比起错误码,显示错误信息更加直观。

b.抛出异常会直接被捕捉,不像返回错误码,如果涉及多层调用,需要不断向上递归返回错误码。

c.使用第三方库需要使用异常操作

d.在无返回值的函数中,也只能采用异常处理这种操作,比如构造函数。

缺点:

a.在一个大项目中去调试程序会非常痛苦。你可能打了一个断点,程序执行到某个位置抛出了异常,直接就跳到了一个预期之外的地方。

b.c++标准库提供的异常类我们都不太喜欢使用。各个公司采用不同的异常处理方式,导致场面极度混乱,并且必须规范使用。

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

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

相关文章

Kubernetes学习(一)入门及集群搭建

一、简介 1.简介 Kubernetes 最初源于谷歌内部的Borg&#xff0c;Kubernetes 是一个全新的基于容器技术的分布式架构解决方案。 包含几个基本功能&#xff1a; 1.将应用水平扩容到多个集群 2.为扩容的实例提供负载均衡策略 3.提供基本的健康检查和自愈能力 4.实现任务的…

电机无位置控制方法研究

无位置控制方法研究 1.无位置控制技术研究现状 2.反电动势过零检测法 3.反电动势三次谐波积分检测法 4.续流二极管法 5.磁链法 6.扩展卡尔曼滤波算法&#xff08;EKF&#xff09; 7.基于扩展卡尔曼滤波算法&#xff08;EKF&#xff09;的转速及位置估算 8.电感测量法 9.涡流效…

LeetCode-878. 第 N 个神奇数字【数学,二分查找,找规律】

LeetCode-878. 第 N 个神奇数字【数学&#xff0c;二分查找&#xff0c;找规律】 题目描述&#xff1a;解题思路一&#xff1a;二分答案容斥原理。给定一个上下界&#xff0c;然后依次增大下界或者减小上界&#xff0c;直到只剩一个答案。容斥原理是&#xff0c;加上两个集合&a…

六、TCP实现聊天

客户端&#xff1a; 连接服务器 Socket(address,port)发送消息 import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets;/*** 客…

LabVIEW使用VI Snippets存储和共享重用代码段

LabVIEW使用VI Snippets存储和共享重用代码段 VI Snippets是存储、共享和重用LabVIEW代码小部分的新方式。VI代码段将截图的可移植性与VI文件的功能结合在标准PNG图像中嵌入LabVIEW代码。当将VI代码段PNG图像拖到框图上时&#xff0c;它会将代码片段作为图形代码拖放&#xff…

【C++】重载运算符+-=>/*[]==++-- MyString 智能指针(* ->)

目录 15.重载运算符 15.1 eg.Person 15.2 eg.MyString 15.3 智能指针 15.重载运算符 定义&#xff1a;给原有的运算符赋予新的意义。 为什么重载<<或>>一定要用友元&#xff1f; 如果是重载双目操作符&#xff08;即为类的成员函数&#xff09;&#xff0c;就…

10年老码农亲授:什么是分布式系统

首先&#xff0c;分布式系统是在硬件成本日益提高&#xff0c;或者单机提升的成本过于昂贵而程序的问题得不到解决时&#xff0c;为了解决更加高效、内容量更大的数据而采取的一种解决手段。 而分布式系统又分为两个部分&#xff0c;计算和存储&#xff0c;而准确来说这两部分…

知行之桥EDI系统2022版Tomcat部署

1.首先需要下载Tomcat&#xff0c;可在Tomcat官网获取&#xff0c;本部署步骤以apache-tomcat-9.0.67.tar.gz为例&#xff0c;通过XFTP将该包放在服务器上的指定位置&#xff0c;如/opt/test 进入/opt/test文件夹后&#xff0c;在命令行执行以下命令对该包进行解压缩 tar -zxv…

大数据毕设 - 公交数据分析与可视化系统(大数据 python flask)

文章目录0 前言1 课题背景2 具体实现3 Flask框架4 ECharts可视化工具5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设的要求越…

Smart Tomcat + Servlet API的应用

文章目录前言一、Smart Tomcat二、Servlet API1.HttpServlet&#xff08;1&#xff09;方法&#xff08;2&#xff09;描述servlet的生命周期&#xff08;3&#xff09;案例2.HttpServletRequest&#xff08;1&#xff09;方法&#xff08;2&#xff09;代码示例打印请求信息获…

若依框架图片上传、富文本框编辑器功能

文章目录一、前言二、效果三、编码过程1.前端&#xff1a;index.vueprojectShow.js富文本框: Editor/index.vue图片上传&#xff1a;ImgUploadCropper/index.vue2.后端&#xff1a;实体ProjectShowProjectShowControllerIProjectShowServiceProjectShowServiceImplProjectShowM…

Linux命令大全

前言 Linux 的学习对于一个程序员的重要性是不言而喻的。前端开发相比后端开发&#xff0c;接触 Linux机会相对较少&#xff0c;因此往往容易忽视它。但是学好它却是程序员必备修养之一。 作者使用的是阿里云服务器 ECS &#xff08;最便宜的那种&#xff09; CentOS 7.7 64位…

指针初阶(C语言)

指针 指针是什么 内存划分是一个字节一个字节来划分的&#xff0c;其中每个字节都有一个编号来标识它&#xff0c;我们将这个编号称为地址&#xff0c;而指针就是地址 注意&#xff1a;编号是不占内存空间的&#xff0c;&#xff08;这些编号在内存中用十六进制表示&#xff0…

正厚软件 | App测试面试题及参考答案

最近整理了一些关于App测试的面试题。 本参照答案是本人在工作实践中总结&#xff0c;仅代表个人观点&#xff0c;如有错误&#xff0c;请谅解。 问&#xff1a;说一些你在测试过程中常用到的adb命名 答&#xff1a;回答本问题时&#xff0c;首先不要想到哪个命名就说哪个命令…

锐捷ISIS基础实验

目录 ISIS理论讲解 配置ISIS邻居建立 配置路由渗透&#xff08;泄露&#xff09; ISIS其它的配置特性 配置ISIS时间属性 配置ISIS认证 ISIS理论讲解 ISIS——基本概念1&#xff08;邻居建立、路由计算、报文封装&#xff09;_静下心来敲木鱼的博客-CSDN博客https://blog…

2022年全球高被引科学家公布

博士后、访问学者及联合培养申请者&#xff0c;都希望去名校及牛导麾下深造。名校有世界几大排名体系做参考&#xff0c;其知名度毋庸置疑。但牛导的概念是什么呢&#xff1f;知识人网小编在此介绍最新推出的“2022年度高被引科学家”&#xff0c;这里云集了全球自然科学和社会…

教你使用 SO_REUSEPORT 套接字选项提升服务性能

前言 Linux 网络栈中有一个相对较新的特性——SO_REUSEPORT 套接字选项&#xff0c;可以使用它来提升你的服务性能。 图 1: 上面的服务是使用并行监听器来避免请求连接瓶颈&#xff0c;而下面的服务只使用一个监听器来接收连接 概要 HAProxy 和 NGINX 是少数几个使用 Linux …

线段树什么的不是简简单单嘛,我教你!:基础篇

线段树什么的不是简简单单嘛&#xff0c;我教你&#xff01;&#xff1a;基础篇 零、序言——万物滴开篇 也许你是苦于笔试的打工人&#xff0c;也许你是步入算法圈不久的小小萌新&#xff08;我也是萌新&#xff09; &#xff0c;也许你是在网上搜索数据结构课设的倒霉学生。…

2049. 统计最高分的节点数目-数组树构造+遍历求解最大值数目

2049. 统计最高分的节点数目-数组树构造遍历求解最大值数目 给你一棵根节点为 0 的 二叉树 &#xff0c;它总共有 n 个节点&#xff0c;节点编号为 0 到 n - 1 。同时给你一个下标从 0 开始的整数数组 parents 表示这棵树&#xff0c;其中 parents[i] 是节点 i 的父节点。由于…

音视频 - 视频编码原理

目录 视频编码主要分为 图像的冗余 熵编码 帧内预测 帧间预测 DCT变换和量化 编码器比较 清晰度和耗时对比 一部电影1080P&#xff0c;帧率25fps&#xff0c;时长2小时&#xff0c;文件大小 1920x1080x1.5x25x2x360 521.4G 数据量非常大&#xff0c;对存储和网络传输都…