C++异常

文章目录

  • C++异常
    • 异常语法
      • 代码示例
    • 栈解旋
      • 示例代码
    • noexcept
      • 代码示例
    • 异常的声明周期
      • 示例代码
    • 异常的多态使用
      • 代码示例
    • C++标准异常库
      • 代码示例
    • 重写自己的异常
      • 示例代码

C++异常

异常是处理程序中的错误。所谓的错误时指程序运行的过程中发生的一些异常事件(如:除零错误,数组下标越界,所要读取的文件不存在,空指针,内存不足等)

C++异常机制相比C语言异常处理的优势:

  • 函数返回值可以忽略,但是异常不可以忽略,并且容易和正常结果混淆;
  • 如果程序出现异常,但是没有被捕获,程序就会终止;

异常语法

代码示例

#include <iostream>
#include <string>
#include <iostream>
using namespace std;
int test01()
{throw 0;return 0;
}
void test02()
{try{test01();}catch (int e){std::cout << "int exception " << e << std::endl;}catch (char e){std::cout << "char exception " << e << std::endl;}catch (...){std::cout << "normal exception " << std::endl;}
}
int main(int argc, char* argv[])
{test02();return 0;
}

栈解旋

异常抛出后,从try起,到异常被抛出前,这期间在栈上构造的所有对象都会被自动析构。析构的顺序与构造的顺序相反,这一过程称为栈的解旋。

示例代码

#include <iostream>
#include <string>
#include <iostream>
using namespace std;
class Person
{
public:Person(string name1){name = name1;cout << "Person " << name << endl;}~Person(){cout << "~Person" << name << endl;}string name;
};
void test()
{try {Person p("1");Person p1("2");Person p2("3");throw 10;}catch (...){cout << "exception" << endl;}
}
int main(int argc, char* argv[])
{test();return 0;
}

noexcept

  • 为了加强程序可读性,可以在函数声明中指定是否可以抛出异常。

例如:void func() noexcept(true);表示函数函数无法抛出异常, 后面的true可省略

例如:void func() noexcept(false);表示函数函数可能抛出异常

代码示例

#include <iostream>
#include <string>
#include <iostream>
using namespace std;
void test() noexcept(false)
{// throw 10;
}
void test01() noexcept(true)
{throw 10;
}
int main(int argc, char* argv[])
{try {test();test01();}catch (...){cout << "exception" << endl;}return 0;
}

异常的声明周期

throw 的异常是有类型的,可以是数字、字符串、类对象。throw的异常是有类型的,catch需要严格匹配异常的类型。

示例代码

#include <iostream>
#include <string>
#include <iostream>
using namespace std;class MyException
{
public:MyException(){cout << "MyException" << endl;}MyException(const MyException &other){cout << "MyException2" << endl;}~MyException(){cout << "~MyException" << endl;}
};
int test1()
{try {throw MyException();}catch (MyException e){cout << "exception" << endl;}return 0;
}
int test2()
{try {throw MyException();}catch (const MyException &e){cout << "exception" << endl;}return 0;
}
int test3()
{try {throw new MyException();}catch (MyException *e){cout << "exception" << endl;delete e;e = nullptr;}return 0;
}
int test4()
{try {MyException ob;throw ob;}catch (MyException &e){cout << "exception" << endl;}return 0;
}
int test5()
{try {throw MyException();}catch (MyException &e){cout << "exception" << endl;}return 0;
}
int main(int argc, char* argv[])
{test5();return 0;
}

注意: 抛出指针的时候记得析构, 推荐test5()的这种方式,可以提高效率。

异常的多态使用

与正常多态使用无差别

代码示例

#include <iostream>
#include <string>
#include <iostream>
using namespace std;
class BaseException
{
public:virtual void printLog() = 0;
};
class DeriveException1 : public BaseException
{
public:void printLog() override{cout << "exception1" << endl;}
};
void test()
{try {throw DeriveException1();}catch (BaseException &e){e.printLog();}
}int main(int argc, char* argv[])
{test();return 0;
}

C++标准异常库

标准库中有很多的异常类,它们是通过类继承组织起来的。

在这里插入图片描述

exception 类的直接派生类:

异常名称说 明
logic_error逻辑错误。
runtime_error运行时错误。
bad_alloc使用 new 或 new[ ] 分配内存失败时抛出的异常。
bad_typeid使用 typeid 操作一个 NULL 指针,而且该指针是带有虚函数的类,这时抛出 bad_typeid 异常。
bad_cast使用 dynamic_cast 转换失败时抛出的异常。
ios_base::failureio 过程中出现的异常。
bad_exception这是个特殊的异常,如果函数的异常列表里声明了 bad_exception 异常,当函数内部抛出了异常列表中没有的异常时,如果调用的 unexpected() 函数中抛出了异常,不论什么类型,都会被替换为 bad_exception 类型。

logic_error 的派生类:

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

runtime_error 的派生类:

异常名称说 明
range_error计算结果超出了有意义的值域范围。
overflow_error算术计算上溢。
underflow_error算术计算下溢。

代码示例

#include <iostream>
#include <string>
#include <iostream>
using namespace std;
void test(int i)
{try {if(i > 50){throw out_of_range("越界");}else{throw exception("exception");}}catch (exception &e){cout << e.what() << endl;}
}
int main(int argc, char* argv[])
{test(60);return 0;
}

重写自己的异常

使用继承实现一个自己的异常(我这里是一个简单的实现)

示例代码

#include <iostream>
#include <string>
#include <iostream>
using namespace std;
class MyException : public exception
{
public:MyException(const char *data) noexcept: exception(data){}
};
void test(int i)
{try {throw MyException("my exception");}catch (exception &e){cout << e.what() << endl;}
}
int main(int argc, char* argv[])
{test(60);return 0;
}

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

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

相关文章

百数应用中心——生产制造管理解决方案解决行业难题

传统生产制造业面临着许多挑战&#xff0c;其中一些主要问题包括效率低下、交期压力大、需求预测不准确、生产模式复杂、异常响应慢、库存高和计划脱节等。这些问题不仅影响了生产效率和质量&#xff0c;也导致了不必要的成本和客户满意度下降。 生产制造管理应用对于企业的生产…

介绍几种使用工具

FileWatch&#xff0c;观测文件变化&#xff0c;源码地址&#xff1a;https://github.com/ThomasMonkman/filewatch nlohmann::json&#xff0c;json封装解析&#xff0c;源码地址&#xff1a;https://github.com/nlohmann/json optionparser&#xff0c;解析选项&#xff0c;源…

前端 js实现 选中数据 动态 添加在表格中

如下图展示&#xff0c;表格上方有属性内容&#xff0c;下拉选中后&#xff0c;根据选中的内容&#xff0c;添加在下方的表格中。 实现方式&#xff0c;&#xff08;要和后端约定&#xff0c;因为这些动态添加的字段都是后端返回的&#xff0c;后端自己会做处理&#xff0c…

MATLAB粒子群算法求解带容量约束的物流配送选址问题实例

粒子群算法编程问题实例: MATLAB粒子群算法求解带容量约束物流配送中心选址问题代码实例 在经度范围为(116, 118),纬度范围为(38, 40)的矩形区域内,散布着37个需求点,各个需求点的坐标及需求量见表1。要求在该矩形区域内确定N个位置建立配送中心。已知各配送中心容量不得超…

UE5.1 透明渲染流程框架图

相关文章&#xff1a; UE 透明物体绘制准备_sh15285118586的博客-CSDN博客 透明直接光和间接光生成_sh15285118586的博客-CSDN博客 Scene:Translucency-Translucency(AfterDOF)_sh15285118586的博客-CSDN博客 Scene:Translucency-Distortion &PostProcessing:ComposeTran…

Jmeter和Postman那个工具更适合做接口测试?

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…

【Tkinter系列12/15】 Toplevel窗口方法、小部件方法

25、顶级窗口 方法Toplevel 顶级窗口是 在窗口管理器下具有独立存在。它 装饰有窗管的装饰&#xff0c;可以 独立移动和调整大小。您的应用程序可以 使用任意数量的顶级窗口。 对于任何小部件&#xff0c;您可以访问其顶级窗口用&#xff1a;ww.winfo_toplevel() 创建新的顶级窗…

请一定要使用枚举和常量

1.魔法值和硬编码 在代码编写的场景中&#xff0c;会遇到提示避免去使用 魔法值&#xff08;magic numbers&#xff09;和硬编码&#xff08;hardcoding&#xff09;。 魔法值就是在代码中直接使用的&#xff0c;没有提供任何注释或解释说明其用途和含义的常数值。硬编码指的…

ubuntu18安装cmake27的方法

背景是ubuntu18默认的cmake是3.10 $ apt search cmake Sorting... Done Full Text Search... Done bear/bionic,bionic 2.3.11-1 allgenerate compilation database for Clang toolingcatkin/bionic,bionic 0.7.8-1 allLow-level build system macros and infrastructure for …

【数据蒸馏】静态数据蒸馏方法汇总

基于几何的方法 基于几何的方法假设在特征空间中彼此接近的数据点往往具有相似的属性。因此&#xff0c;基于几何的方法试图移除那些提供冗余信息的数据点&#xff0c;剩下的数据点形成一个核心集合S&#xff0c;其中jSj ≤ jTj。 Herding&#xff08;聚集&#xff09; 是一…

[足式机器人]Part3 变分法Ch01-2 数学预备知识——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《变分法基础-第三版》老大中 《变分学讲义》张恭庆 《Calculus of Variations of Optimal Control Theory》-变分法和最优控制论-Daneil Liberzon Ch01-2 数学基础-预备知识1 1.3.2 向量场的通量和散度1.3.3 高斯定理与格林公式 1.3.2 …

etcd 备份还原

etcd 备份还原 1. 查看 etcdctl 是否已经安装 # quick check if etcdctl is available or not ETCDCTL_API3 etcdctl --help | head2. 安装 etcdctl # 获取 etcd 版本信息 kubectl exec -it etcd-master -n kube-system -- /bin/sh -c ETCDCTL_API3 /usr/local/bin/etcd --v…

FPGA SPI 驱动程序

1.引言 此驱动程序已经完成很久了&#xff0c;花了2个星期的时间&#xff0c;主要是提升程序运行的效率。最近整理文件的时候又看到了&#xff0c;记录一下。 2.程序框架分解 module adc7254_Ctrl(input sys_clk, //system clkc 50Minput re…

react跳转页面redux数据被清除

关键代码如下&#xff0c;页面中有根据redux中state展示的数据&#xff0c;然后在组件卸载的时候会清空redux中存的数据&#xff0c;点击a标签可以打开新的标签页&#xff0c;如下代码会在打开新的标签页&#xff0c;组件卸载&#xff0c;清空redux数据&#xff0c;页面展示的也…

MySQL中的索引事务(1)索引----》数据库运行的原理知识+面试题~

本篇文章主要讲述MySQL索引事务 所谓的索引index就是指&#xff1a;目录~~ 索引存在的意义&#xff1a;加快查找的速度&#xff08;省略了遍历的过程&#xff09;&#xff0c;但付出了一定的代价~ 付出的代价如下&#xff1a; 1.需要付出额外的空间代价来保存索引数据2.索引…

Nginx安装及使用

这里写目录标题 Nginx一.IO模型1.I/O模型相关概念2.网络I/O模型阻塞型I/O模型非阻塞型I/O模型多路复用 I/O 型信号驱动式 I/O模型异步I/O模型总结 二.Nginx概述三.Nginx模块四.安装及使用Nginx1.编译安装Nginx2.yum安装3.命令及信号使用4.USR1分割日志5.升级Nginx 五.配置详细解…

c#object类中方法的使用

C#中的Object类是所有类的基类&#xff0c;它定义了一些通用的方法和属性&#xff0c;可以在任何对象上使用。以下是Object类中常用的方法和属性的使用&#xff1a; 1.ToString()&#xff1a;将对象转换为字符串表示形式。 string str obj.ToString();2.Equals()&#xff1a;…

Windows下Redis的安装和配置

文章目录 一,Redis介绍二,Redis下载三,Redis安装-解压四,Redis配置五,Redis启动和关闭(通过terminal操作)六,Redis连接七,Redis使用 一,Redis介绍 远程字典服务,一个开源的,键值对形式的在线服务框架,值支持多数据结构,本文介绍windows下Redis的安装,配置相关,官网默认下载的是…

【力扣】两数相除(c/c++)

目录 题目 注意&#xff1a; 示例 1: 示例 2: 提示&#xff1a; 题目解析 题目思路 代码思路 数据处理 注意 减法函数 第一次使用的函数 问题 第二次改良后的代码 处理i的值并且返回 总代码 力扣的代码 注意 题目 给你两个整数&#xff0c;被除数 dividend 和…

关于Comparable、Comparator接口返回值决定顺序的问题

Comparable和Comparator接口都是实现集合中元素的比较、排序的&#xff0c;下面先简单介绍下他们的用法。 1. 使用示例 public class Person {private String name;private Integer age;public Person() {}public Person(String name, Integer age) {this.name name;this.ag…