C++之异常处理(try, catch, throw)

在C++中,异常处理是一种用于处理程序运行过程中可能出现的错误或异常情况的机制。通过使用异常处理,可以确保程序在遇到错误时能够优雅地恢复或退出,而不是直接崩溃。C++中的异常处理主要通过try, catch, throw关键字来实现。

基本概念

  • try:用于包裹可能会抛出异常的代码段。
  • catch:用于捕获并处理由try块中抛出的异常。
  • throw语句:用于显式地抛出一个异常。

基本语法

try {// 可能会抛出异常的代码
} catch (ExceptionType1& e1) {// 处理ExceptionType1类型的异常
} catch (ExceptionType2& e2) {// 处理ExceptionType2类型的异常
} catch (...) {// 捕获所有未被捕获的异常
}

示例代码

抛出异常
#include <iostream>
#include <stdexcept> // 包含标准异常类void checkAge(int age) {if (age < 0 || age > 120) {throw std::invalid_argument("年龄不在合理范围内");}
}int main() {try {int age = -5;checkAge(age);} catch (const std::invalid_argument& e) {std::cerr << "捕获到异常: " << e.what() << std::endl;} catch (...) {std::cerr << "未知异常" << std::endl;}return 0;
}
自定义异常类

除了使用标准库提供的异常类外,还可以定义自己的异常类。

#include <iostream>
#include <exception>class AgeException : public std::exception {
private:const char* message;
public:AgeException(const char* msg) : message(msg) {}const char* what() const noexcept override {return message;}
};void checkAge(int age) {if (age < 0 || age > 120) {throw AgeException("年龄不在合理范围内");}
}int main() {try {int age = -5;checkAge(age);} catch (const AgeException& e) {std::cerr << "捕获到自定义异常: " << e.what() << std::endl;} catch (...) {std::cerr << "未知异常" << std::endl;}return 0;
}

异常处理的最佳实践

  1. 避免过度使用异常:异常处理有性能开销,不应用于控制正常的程序流程。
  2. 捕获具体的异常:尽量捕获具体的异常类型,而不是捕获所有异常,这样可以更好地处理特定的情况。
  3. 资源管理:使用RAII(Resource Acquisition Is Initialization)原则,确保资源在异常情况下也能正确释放。例如,使用智能指针来管理动态分配的内存。
  4. 异常安全:确保函数在抛出异常后不会导致资源泄漏或数据损坏。常见的异常安全级别包括:
    • 基本保证:在异常发生后,对象处于有效状态,但可能不满足预期的状态。
    • 强保证:在异常发生后,对象保持事务一致性,即要么完全成功,要么完全回滚。
    • 不抛出保证:函数承诺不会抛出任何异常。

通过合理使用异常处理,可以使程序更加健壮和可靠。

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

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

相关文章

SQL注入学习

SQL注入概念及产生原因 当web应用向后台数据库传递SQL语句进行数据库操作时&#xff0c;如果对用户输入的参数没有经过严格的过滤处理&#xff0c;那么攻击者就可以构造特殊的SQL语句&#xff0c;直接输入数据库引擎执行&#xff0c;获取或修改数据库中的数据。

【前端】深入浅出 - TypeScript 的详细讲解

TypeScript 是一种静态类型编程语言&#xff0c;它是 JavaScript 的超集&#xff0c;添加了类型系统和编译时检查。TypeScript 的主要目标是提高大型项目的开发效率和可维护性。本文将详细介绍 TypeScript 的核心概念、语法、类型系统、高级特性以及最佳实践。 1. TypeScript…

【Linux】Linux环境基础开发工具使用(下)

【Linux】Linux环境基础开发工具使用(下) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;Linux&#x1f34a; &#x1f33c;文章目录&#x1f33c; 4. Linux编辑器--gcc /g的使用 4.1 背景知识 4.2 gcc如何完成 4.2.1 预处理 4.2.2 编…

GPU性能测试,环境搭建笔记,transformers/huggingface_hub改国内源,BertLayer import 报错

代码&#xff0c;以及测试方案使用的是沐神的代码 github的代码&#xff1a; 1. 环境搭建 首先是安装torch 这是我的pytorch版本 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124使用pip指令安装transformers transformers…

PR剪辑视频去重消重色彩叠加特效模板

采用现代设计&#xff0c;灵感来自鲜艳的色彩和动态的灯光效果。包含颜色控制选项&#xff0c;能够轻松地调整效果以匹配您的视频风格。具有图像和视频替换功能。 易用性&#xff1a;适合所有经验水平的用户&#xff0c;包括初学者。 调色板自定义&#xff1a;完全控制颜色以匹…

采购管理软件选择攻略:别忽视这些注意事项

企业在选择采购管理软件时必须谨慎&#xff0c;因为这直接关系到简化采购流程、成本控制、风险降低和效率提升等多个方面。面对内众多的软件选项和竞争目标&#xff0c;采购团队可能难以做出正确的选择。别担心&#xff0c;本文将提供一些建议和注意事项。 采购管理软件的重要性…

关于 npm 更新镜像源问题

npm&#xff08;Node Package Manager&#xff09;&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。&#xff09; 查看当前npm版本 npm -v 10.9.0 执行以下命令报错 npm install --registryhttp…

【OceanBase 诊断调优】—— OceanBase 数据库统计信息被禁用,状态为 broken 的原因和解决方法

问题现象 因为人为因素导致部分统计信息函数未安装&#xff0c;自动统计信息触发执行长期失败。重新安装统计信息相关函数后&#xff0c;发现仍然无法正常自动统计信息收集&#xff0c;统计信息状态为 broken。 问题原因 统计信息 JOB 收集失败次数达到 16 次会直接禁用 JOB …

2024腾讯云双十一必抢清单:省钱、省心、省力的购买攻略

一、前言 大家好&#xff0c;我是 Neo&#xff01;一年一度的双十一购物狂欢节又到了&#xff01;在这个特别的日子&#xff0c;腾讯云也推出了超值的优惠活动。最近我正好在做自己的小程序项目&#xff0c;需要用到服务器&#xff0c;特意关注了这次活动&#xff0c;看看有没…

业财税深度融合,金鹰国际集团以数字化打造硬实力

数字经济时代&#xff0c;企业数字化转型已成必然&#xff0c;越来越多的企业踏浪前行&#xff0c;加速探索全领域的数字化转型&#xff0c;获得竞争优势。数字化技术的快速发展也加速了税收征管改革进程&#xff0c;财务数字化成为企业转型升级的有力抓手&#xff0c;助力优化…

Spring Boot 多环境开发配置详解:Profiles 的使用指南

目录 前言1. Profiles 简介1.1 什么是 Profiles&#xff1f;1.2 Profiles 的应用场景 2. 单文件配置方式2.1 使用三横杠 --- 分隔配置2.2 指定哪个环境的配置生效 3. 多文件配置方式3.1 配置文件的创建与命名3.2 多文件配置的优点 4. Profiles 分组管理4.1 Profile 分组的配置4…

emp.dll文件丢失的几种方法-常见问题

emp.dll文件在Windows系统中扮演着重要的角色&#xff0c;其作用不仅限于单一的应用程序或游戏。以下是emp.dll在系统中的几种作用&#xff1a; 图形渲染与游戏支持&#xff1a;emp.dll可能集成了高效的渲染引擎&#xff0c;支持复杂的3D图形和动画&#xff0c;为玩家提供沉浸…

永久免费!星火大模型接口源码分享(支持上下文、连续对话和历史对话保存)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 星火大模型 📒🌟 接口功能📜 源码分享🎯 使用方法⚓️ 相关链接 ⚓️📖 介绍 📖 你是否在寻找一款国产的、永久免费的大模型接口?想要在自己的项目中轻松集成强大的自然语言处理能力?今天,将为你分享一份免费的星…

小型内衣洗衣机哪个牌子好?五大超值优等品速来围观!

小型洗衣机的存在无疑是懒人的福音&#xff0c;它帮助了许多忙碌的人们解决了洗衣烦恼。尤其对于年龄较小的婴幼儿需要勤换衣、洗衣的时候&#xff0c;它的功能就显得尤为重要了&#xff0c;同时还能够用于清洗大人的内衣裤、袜子这一系列的贴身衣物。小型洗衣机通常用于宿舍、…

取代产品岗,又一新兴岗位在崛起!这才是产品经理未来5年最好的就业方向!

这是我入行产品经理的第1007天&#xff1a; 每天都是整理需求、开会、写文档、协调资源 被开发、运营diss一通&#xff0c;顺便为产品“背个锅” 熬夜加班做出来的产品&#xff0c;业务团队还是不愿意用…… 更让人头秃的是&#xff0c;干了3年&#xff0c;好像到了“职…

打造自己的RAG解析大模型:(可商用)智能文档服务上线部署

通用版面分析介绍 版面解析是一种将文档图像转化为机器可读数据格式的技术&#xff0c;广泛应用于文档管理和信息提取等领域。通过结合OCR、图像处理和机器学习&#xff0c;版面解析能够识别文档中的文本块、图片、表格等版面元素&#xff0c;最终生成结构化数据&#xff0c;大…

Spring

1、Spring框架中单例bean是线程安全的吗&#xff1f; 不是线程安全的。当多用户同时请求一个服务时&#xff0c;容器会给每个请求分配一个线程&#xff0c;这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改&#xff0c;比如修改单例的成员属性&#xff0c;就必…

MathGPT的原理介绍,在中小学数学教学的应用场景,以及代码样例实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下MathGPT的原理介绍&#xff0c;在中小学数学教学的应用场景&#xff0c;以及代码样例实现。MathGPT的核心架构是一个精心设计的多层次系统&#xff0c;旨在有效处理复杂的数学问题。其主要组成部分包括 数学知识图谱…

【Linux】man 手册的使用指南

man 手册的使用指南 man手册中文版上传至资源&#xff08;用心整理&#xff0c;感谢理解&#xff01;&#xff09; man手册官方下载链接&#xff1a;https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/ man 手册页&#xff1a;https://linux.die.net/man/ Linux man…

机器学习分析scRNA-seq解析急性髓系白血病中的疾病和免疫过程

急性髓性白血病&#xff08;AML&#xff0c;Acute myeloid leukemia&#xff09;是一种存在于复杂微环境中的疾病。作者基于scRNA-seq分析了来自40例骨髓抽吸donor的38,410个细胞&#xff0c;包括16例AML患者和5例健康donor。然后&#xff0c;应用机器学习分类器来区分恶性细胞…