当前位置: 首页 > news >正文

「C/C++」C++标准库 之 #include<exception> 异常处理库

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明
「Math」探秘数学世界

目录

    • C++异常处理详解
      • 一、C++ 异常处理的基本结构
      • 二、自定义异常类
      • 三、异常规范(C++11 已废弃)
      • 四、标准异常类
      • 五、多重捕获和重新抛出
      • 六、总结

C++异常处理详解

在现代编程中,异常处理是确保程序健壮性和可靠性的重要机制之一。C++ 提供了一套强大且灵活的异常处理框架,允许程序在运行时遇到错误或异常情况时,能够优雅地处理这些状况,而不是简单地崩溃或终止。本文将深入探讨 C++ 中的异常处理机制,包括 trythrowcatch 关键字的使用,以及自定义异常类、异常规范、标准异常类和多重捕获等内容。

一、C++ 异常处理的基本结构

C++ 的异常处理主要依赖于三个关键字:trythrowcatch

  1. try 块
    try 块标记了一段可能抛出异常的代码。在 try 块内部,你可以写正常的程序代码,同时也可以调用可能抛出异常的函数或方法。

    try {// 可能抛出异常的代码
    }
    
  2. throw 语句
    try 块中的代码检测到某个错误或异常情况时,可以使用 throw 语句抛出一个异常。throw 后面可以跟基本数据类型(如 intchar 等)、对象或者是指针。

    throw expression;
    

    例如,如果检测到数组越界,可以抛出一个整数异常:

    throw 100; // 抛出一个整数异常
    
  3. catch 块
    catch 块用于捕获和处理由 try 块中抛出的异常。每个 catch 块都会指定一个异常类型,当抛出的异常类型与 catch 块指定的类型匹配时,该 catch 块就会被执行。

    catch (exception_type variable) {// 处理异常的代码
    }
    

    例如,捕获并处理前面抛出的整数异常:

    try {throw 100;
    } catch (int e) {std::cout << "Caught an integer exception: " << e << std::endl;
    }
    

二、自定义异常类

在实际开发中,常常需要抛出和捕获具有特定意义的异常。为此,可以定义自己的异常类。自定义异常类通常继承自 std::exception 类(或其派生类),这样可以利用标准异常类提供的功能,如获取错误消息等。

#include <iostream>
#include <exception>
#include <string>class MyException : public std::exception {
public:MyException(const std::string& message) : msg_(message) {}virtual const char* what() const noexcept override {return msg_.c_str();}private:std::string msg_;
};int main() {try {throw MyException("Something went wrong!");} catch (const MyException& e) {std::cerr << "Caught MyException: " << e.what() << std::endl;}return 0;
}

三、异常规范(C++11 已废弃)

在 C++11 之前,函数声明中可以包含异常规范,指明该函数可能抛出的异常类型。不过,由于该特性在实际应用中很少使用且存在限制,C++11 标准已将其废弃,并在 C++17 中完全移除。因此,这里仅做简要介绍,不建议在新代码中使用。

void mightThrowException() throw(int, std::bad_alloc); // C++98/03 语法,C++11 已废弃

四、标准异常类

C++ 标准库提供了一系列标准异常类,这些类继承自 std::exception 类。使用标准异常类可以让代码更加规范,便于理解和维护。

  • std::bad_alloc:内存分配失败时抛出。
  • std::bad_cast:动态类型转换失败时抛出(如 dynamic_cast 失败)。
  • std::bad_exception:未知的异常被 std::unexpected 函数抛出时抛出。
  • std::domain_error:数学函数域错误时抛出(如 sqrt(-1))。
  • std::invalid_argument:传递给函数的参数无效时抛出。
  • std::length_error:试图创建超过允许长度的对象时抛出(如 std::string 太长)。
  • std::out_of_range:使用超出有效范围的值时抛出(如数组索引越界)。
  • std::overflow_error:算术运算结果超出可表示范围时抛出(如整数溢出)。
  • std::range_error:使用无效范围的值时抛出(如 std::stoi 转换失败)。
  • std::runtime_error:运行时错误时抛出(一般异常)。
  • std::underflow_error:算术运算结果低于可表示范围时抛出(如负整数下溢)。

五、多重捕获和重新抛出

一个 try 块可以对应多个 catch 块,以捕获不同类型的异常。此外,还可以在 catch 块中重新抛出异常,以便上层调用者处理。

try {// 可能抛出多种异常的代码
} catch (const std::runtime_error& e) {std::cerr << "Runtime error: " << e.what() << std::endl;
} catch (const std::bad_alloc& e) {std::cerr << "Memory allocation failed: " << e.what() << std::endl;
} catch (...) {std::cerr << "Unknown exception caught!" << std::endl;// 可以选择重新抛出异常throw;
}

在上面的代码中,catch (...) 是一个通配符捕获块,它可以捕获所有类型的异常。

六、总结

C++ 的异常处理机制为编写健壮和可靠的程序提供了强大的支持。通过合理使用 trythrowcatch 关键字,以及自定义异常类和标准异常类,可以显著提升代码的错误处理能力和可维护性。在实际开发中,应根据具体需求选择合适的异常处理方式,并尽量避免滥用异常,以保持代码的清晰和高效。


在这里插入图片描述

相关文章:

「C/C++」C++标准库 之 #include<exception> 异常处理库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

YOLOv7-0.1部分代码阅读笔记-experimental.py

experimental.py models\experimental.py 目录 experimental.py 1.所需的库和模块 2.class CrossConv(nn.Module): 3.class Sum(nn.Module): 4.class MixConv2d(nn.Module): 5.class Ensemble(nn.ModuleList): 6.def attempt_load(weights, map_locationNone): 1…...

【大数据学习 | kafka】简述kafka的消费者consumer

1. 消费者的结构 能够在kafka中拉取数据进行消费的组件或者程序都叫做消费者。 这里面要涉及到一个动作叫做拉取。 首先我们要知道kafka这个消息队列主要的功能就是起到缓冲的作用&#xff0c;比如flume采集数据然后交给spark或者flink进行计算分析&#xff0c;但是flume采用的…...

系统架构设计师论文:论湖仓一体架构及其应用

试题四 论湖仓一体架构及其应用 随着5G、大数据、人工智能、物联网等技术的不断成熟,各行各业的业务场景日益复杂,企业数据呈现出大规模、多样性的特点,特别是非结构化数据呈现出爆发式增长趋势。在这一背景下,企业数据管理不再局限于传统的结构化 OLTP (On-Line Transact…...

电磁兼容(EMC):GB 4343.1喀呖声 详解

目录 1. 喀呖声的危害 2. 喀呖声 Click定义 3. 中频参考电平 4. 开关操作 5. 最小观察时间 6. 喀呖声率 7. 喀呖声限值 8. 上四分位法 1. 喀呖声的危害 喀呖声作为一种电压骚扰&#xff0c;其危害主要体现在以下几个方面&#xff1a; 对电子设备的干扰&#xff1a;喀呖…...

纯血鸿蒙Native层支持说明

本文所有描述均参考鸿蒙官方文档&#xff1a;传送门 1.对C库的支持 C标准函数库在C语言程序设计中&#xff0c;提供符合标准的头文件&#xff0c;以及常用的库函数实现&#xff08;如I/O输入输出和字符串控制&#xff09;。 HarmonyOS采用musl作为C标准库&#xff0c;musl库…...

learn C++ NO.31——类型转换

C语言中的类型转换 在C语言中&#xff0c;当赋值符号两边的类型不匹配的时候&#xff0c;或者是形参类型和实参类型不匹配时&#xff0c;返回值类型与接受返回值类型不匹配时&#xff0c;都会需要类型转换。C语言的类型转换有两种&#xff1a;显示类型转换和隐式类型转换。 显…...

重学 Android 自定义 View 系列(三):自定义步数进度条

前言 本篇文章主要是实现仿QQ步数View&#xff0c;很老的一个View了&#xff0c;但技术永不落后&#xff0c;开搂&#xff01; 最终效果如下&#xff1a; 1. 结构分析 QQStepView 主要由三个元素组成&#xff1a; 显示一个圆环进度条&#xff0c;通过外环和内环的角度变化来…...

海南华志亿星电子商务有限公司赋能抖音商家成长

在当今瞬息万变的电商时代&#xff0c;抖音凭借其短视频与直播电商的独特模式&#xff0c;迅速崛起并引领潮流。在这场电商变革中&#xff0c;海南华志亿星电子商务有限公司以其卓越的服务质量和创新的运营模式&#xff0c;在抖音电商领域大放异彩&#xff0c;成为众多商家的首…...

数据结构-并查集专题(1)

一、前言 因为要开始准备年底的校赛和明年年初的ACM、蓝桥杯、天梯赛&#xff0c;于是开始按专题梳理一下对应的知识点&#xff0c;先从简单入门又值得记录的内容开始&#xff0c;并查集首当其冲。 二、我的模板 虽然说是借用了jiangly鸽鸽的板子&#xff0c;但是自己也小做…...

共享汽车管理新纪元:SpringBoot框架应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…...

道可云人工智能元宇宙每日资讯|《中国生成式人工智能应用与实践展望》白皮书发布

道可云元宇宙每日简报&#xff08;2024年11月6日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 《重庆市“机器人”应用行动计划&#xff08;2024—2027年&#xff09;》发布 近日&#xff0c;重庆市经济和信息化委员会、重庆市教育委员会等八部门印发《重庆市“…...

kaggle学习 eloData项目(1)-数据校验

文章目录 kaggle学习 eloData项目&#xff08;1&#xff09;-数据校验&#xff08;1&#xff09; 数据基本情况查看&#xff08;2&#xff09; 数据校验&#xff08;3&#xff09; 数据探究 小结 kaggle学习 eloData项目&#xff08;1&#xff09;-数据校验 不能懈怠&#xff0…...

ORACLE RAC用DNS服务器的配置

一、搭建本地YUM源 二、安装DNS全部组建 yum -y install bind* 三、规划您RAC集群所有IP #public 192.168.16.111 rac1.ntt.com rac1 192.168.16.112 rac2.ntt.com rac2 192.168.16.121 rac3.ntt.com rac3 192.168.16.122 rac4.ntt.com rac4 #private 10.10.10.111 rac1-pr…...

vue3 + vite 实现版本更新检查(检测到版本更新时提醒用户刷新页面)

背景 当一个页面很久没刷新&#xff0c;又突然点到页面。由于一些文件是因为动态加载的&#xff0c;当重编后&#xff08;如前后端发版后&#xff09;&#xff0c;这些文件会发生变化&#xff0c;就会出现加载不到的情况。进而导致正在使用的用户&#xff0c;点击页面发现加载…...

【CSP】爆零的独特姿势

硝烟散&#xff0c;繁花尽&#xff0c;第一次CSP折戟沉沙。 代码拿回来&#xff0c;花几分钟订正下&#xff0c;就是300分。 然而&#xff0c;实战只有100分&#xff0c;还是偷懒得的幸运&#xff0c;觉得第一题题目太简单懒得用文件IO调试... ... 啥也不说了&#xff0c;上图。…...

Git仓库

Git初始 概念 一个免费开源&#xff0c;分布式的代码版本控制系统&#xff0c;帮助开发团队维护代码 作用 记录代码内容&#xff0c;&#xff0c;切换代码版本&#xff0c;多人开发时高效合并代码内容 如何学&#xff1a; 个人本机使用&#xff1a;Git基础命令和概念 多…...

【科研日常】论文投稿的几大状态

Manuscript Submitted&#xff08;Submitted to Journal&#xff09;&#xff1a;表示论文已经投稿成功&#xff0c;等待期刊工作人员检查论文格式排版、重复率是否符合要求&#xff0c;符合要求的文章会分配给期刊编辑进行处理。 Awaiting Admin Processing&#xff1a;意为等…...

SSLHandshakeException错误解决方案

1、错误提示 调用Http工具报如下异常信息&#xff1a; cn.hutool.core.io.IORuntimeException: SSLHandshakeException: Received fatal alert: handshake_failure2、查询问题 一开始我以为是代码bug&#xff0c;网络bug甚至是配置环境未生效&#xff0c;找了一大圈&#xf…...

python数据结构基础(7)

本节学习最后一种数据结构---图,在很多问题中应用图可以帮助构建思维空间,快速理清思路,解决复杂问题. 图就是一些顶点的集合,这些顶点通过一系列边链接起来.根据边的有向和无向,图分为有向图和无向图.有时图的边上带有权重,本节暂时不将权重作为重点. 计算机通过邻接表或者邻…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...