Cpp异常概述
异常概述
1. 异常处理的重要性和作用: 异常处理是编程中的一个核心组成部分,因为它提供了一种方法来处理程序运行时可能遇到的意外情况,例如文件未找到、网络连接丢失或无效的用户输入等。当这些情况发生时,程序可以优雅地处理它们,而不是崩溃或产生未定义的行为。正确的异常处理可以帮助:
- 保持程序的稳定性
- 提供更友好的用户体验
- 使开发者更容易地调试和诊断问题
- 确保程序的安全性
2. C++中异常处理的基本概念:
Cpp异常处理的三个关键字:try
、catch
、throw
。
- try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。
- catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
- throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
标准异常
Cpp 标准库中提供了一组预定义的异常类,它们是从std::exception
类派生出来的,并在<exception>
头文件中定义。这些异常类形成了一个层次结构,以便您可以编写捕获一般异常的处理程序,或更具体地捕获某些特定类型的异常。
以下是C++标准异常类的部分层次结构:
- std::exception
- 基类,可以捕获所有从这个类派生出来的异常。
- 提供了一个虚拟成员函数
what()
,返回一个表示异常原因的C风格字符串。
- std::bad_alloc
- 当
new
运算符不能为新对象分配足够的内存时抛出。
- 当
- std::bad_cast
- 当用
dynamic_cast
进行不合法的类型转换时抛出。
- 当用
- std::logic_error
- 表示程序逻辑错误。
- std::domain_error
- 当函数接收到超出其定义域的参数时抛出。
- std::invalid_argument
- 当提供了无效的参数时抛出。
- std::length_error
- 当试图创建超过最大大小的
std::string
时抛出。
- 当试图创建超过最大大小的
- std::out_of_range
- 例如,当使用
std::vector::at()
访问超出范围的元素时抛出。
- 例如,当使用
- std::runtime_error
- 表示在运行时检测到的错误。
- std::overflow_error
- 当发生算术上溢时抛出。
- std::underflow_error
- 当发生算术下溢时抛出。
- std::range_error
- 当算术操作的结果不适用于其定义域时抛出。
try / catch 语句
在C++中,try/catch
语句为程序提供了一个捕获和处理运行时异常的机制,使得程序在遭遇预期外的错误时不会崩溃,而是能够进行优雅的异常处理。这种结构允许代码在可能抛出异常的try
块中执行,并使用一个或多个catch
块来捕获和处理这些异常。
语法示例:
try {// 代码,可能会抛出异常
}
catch (ExceptionType1 e1) {// 处理ExceptionType1类型的异常
}
catch (ExceptionType2 e2) {// 处理ExceptionType2类型的异常
}
...
catch (...) {// 捕获所有其他类型的异常
}
#include <iostream>#include <stdexcept> // 需要这个头文件来使用内置的异常类型int main() {try {// 尝试执行可能会抛出异常的代码int dividend = 10;int divisor = 0;if (divisor == 0) {throw std::runtime_error("除数不能为零!"); // 使用throw关键字抛出一个异常}int result = dividend / divisor;std::cout << "结果是:" << result << std::endl;} catch (const std::runtime_error &e) {// 捕获并处理异常std::cout << "发生了一个错误:" << e.what() << std::endl; // e.what()返回异常的描述信息}return 0;}
在这个例子中,当发现除数为0时,我们使用throw
抛出一个std::runtime_error
异常。eatch
块会捕获这个异常并处理它,使程序不会崩溃,并给用户提供一个有意义的错误消息。
自定义异常
自定义异常的操作步骤:
- 创建异常类
- 自定义异常通常通过继承标准的
exception
类来创建。 - 覆盖
what()
方法,返回描述异常的字符串。
- 自定义异常通常通过继承标准的
- 抛出自定义异常:
- 使用
throw
关键字,如同使用内置异常一样。
- 使用
- 捕获自定义异常:
- 使用
try/catch
块捕获自定义异常,与捕获内置异常相同。
- 使用
示例:
#include <iostream>
#include <exception>// 1. 创建自定义异常类
class DivideByZeroException : public std::exception {
public:const char* what() const throw() {return "Attempted to divide by zero!";}
};double divide(double a, double b) {if (b == 0.0) {throw DivideByZeroException(); // 2. 抛出自定义异常}return a / b;
}int main() {try {std::cout << divide(10.0, 0.0) << std::endl;}catch (const DivideByZeroException& e) { // 3. 捕获自定义异常std::cout << "Error: " << e.what() << std::endl;}return 0;
}
相关文章:
Cpp异常概述
异常概述 1. 异常处理的重要性和作用: 异常处理是编程中的一个核心组成部分,因为它提供了一种方法来处理程序运行时可能遇到的意外情况,例如文件未找到、网络连接丢失或无效的用户输入等。当这些情况发生时,程序可以优雅地处理它…...

山东布谷科技直播软件源码Nginx服务器横向扩展:搭建更稳定的平台服务
在直播软件源码平台中,服务器扮演着重要的角色,关系着视频传输、数据处理、用户管理等工作的顺利完成。随着互联网的迅猛发展,直播行业也随之崛起,全世界的人们都加入到了直播软件源码平台中,用户流量的增加让服务器的…...

SystemVerilog之接口详解
1.入门实例 测试平台连接到 arbiter的例子:包括测试平台, arbiter仲裁器, 时钟发生器 和连接的信号。 ㅤㅤㅤ ㅤ ㅤㅤㅤㅤㅤ Arbiter里面可以自定义发送的权重, 是轮询还是自定义 grant表示仲裁出来的是哪一个,也即只有0,1&am…...

RabbitMq-1基础概念
RabbitMq-----分布式中的一种通信手段 1. MQ的基本概念(message queue,消息队列) mq:消息队列,存储消息的中间件 分布式系统通信的两种方式:直接远程调用,借助第三方完成间接通信 消息的发送方是生产者,…...

深度学习1:通过模型评价指标优化训练
P(Positive)表示预测为正样本,N(negative)表示预测为负样本,T(True)表示预测正确,F(False)表示预测错误。 TP:正样本预测正确的数量(正确检测) FP:负样本预测正确数量(误检测) TN…...

excel隔行取数求和/均值
问题描述 如图有好多组数据,需要求每组数据对应位置的平均值 解决方法 SUM(IF(MOD(ROW(C$2:C$81), 8) MOD(ROW(C2), 8), C$2:C$81, 0))/10然后下拉右拉扩充即可,其中需要根据自身需要修改一些数据 SUM(IF(MOD(ROW(起始列$起始行:结束列$结束行), 每…...

批量记录收支明细,轻松通过收支占比图表轻松分析支出项目占比!
您是否希望更加直观地了解个人或企业的支出项目占比情况?是否想通过图表分析,快速定位支出的主要项目,并做出相应的调整?现在,我们的智能收支分析大师为您提供了一种智能化的解决方案!只需几步操作…...

pdf怎么压缩?一分钟学会文件压缩方法
PDF文件过大一般主要原因就是内嵌大文件、重复的资源或者图片比较多,随之而来的问题就是占用存储空间、被平台限制发送等等,这时候我们可以通过压缩的方法缩小PDF文件大小,下面就一起来看看具体的操作方法吧。 方法一:嗨格式压缩大…...

信息安全:防火墙技术原理与应用.
信息安全:防火墙技术原理与应用. 防火墙是网络安全区域边界保护的重要技术。为了应对网络威胁,联网的机构或公司将自己的网络与公共的不可信任的网络进行隔离,其方法是根据网络的安全信任程度和需要保护的对象,人为地划分若干安全…...
PG-DBA培训14:PostgreSQL数据库升级与迁移
一、风哥PG-DBA培训14:PostgreSQL数据库升级与迁移 课程目标: 本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL备份恢复与迁移升级阶段之PostgreSQL数据库升级与迁移,学完本课程可以PostgreSQL数据库升…...

selenium语法进阶+常用API
目录 浏览器操作 浏览器回退,前进 与刷新 浏览器窗口设置大小 浏览器设置宽高 浏览器窗口最大化 浏览器控制滚动条 信息打印 打印页面的标题和当前页面的URL 定位一组元素 鼠标和键盘事件 键盘 鼠标 下拉框操作 通过索引定位(se…...

iOS UIAlertController控件
ios 9 以后 UIAlertController取代UIAlertView和UIActionSheet UIAlertControllerStyleAlert和UIAlertControllerStyleActionSheet。 在UIAlertController中添加按钮和关联输入框 UIAlertAction共有三种类型,默认(UIAlertActionStyleDefault࿰…...

C语言好题解析(二)
目录 递归类型例题1例题2例题3例题4例题5例题6 递归类型 例题1 根据下面递归函数:调用函数Fun(2),返回值是多少( )int Fun(int n) {if (n 5)return 2;elsereturn 2 * Fun(n 1); } A.2 B.4 C.8 D.16【答案】 D 【分析】 …...

数据结构介绍
1、什么是数据结构呢? 计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。数据结构是为了更方便的管理和使用数据,需要结合具体的业务来进行选择。一般情况下,精心选择的数据结构可以带来更高的运行或者存储效率。…...
Kafka基础及常见面试题
1. 用途 1. 流量削峰 2. 流计算 2. Kafka的核心组件 在Kafka中,Producer、Broker和Consumer是三个关键的角色,它们在整个消息传递过程中扮演不同的角色和功能:1. **Producer(生产者)**:生产者是消息的发…...

基于Java的ssm图书管理系统源码和论文
基于Java的ssm图书管理系统036 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,计算机被广泛应用于信息管理系统的环境。计算机的最大好…...

2020年9月全国计算机等级考试真题(C语言二级)
2020年9月全国计算机等级考试真题(C语言二级) 第1题 有下列程序: #include<stdio.h> main() { FILE*fp;int k,n,a[6]{1,2,3,4,5,6}; fpfopen("d2.dat","w"); fprintf(fp,"%d%d%d\n",a[0],…...

【rust/egui】(一)从编译运行template开始
说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0rust windows安装参考:这里本文默认读者已安装相关环…...

VMware虚拟安装Ubuntu,然后切换Ubuntu内核版本
无论你选择哪种方法,一旦进入 GRUB 引导菜单,你应该能够选择需要的内核版本并启动系统。 打开终端:你可以通过按下 Ctrl Alt T 快捷键来打开终端。 使用 sudo:切换内核需要管理员权限,因此你需要使用 sudo 命令。首…...

爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 参数化࿱…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...