「C++系列」异常处理

【人工智能教程】,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。

点击跳转到网站:【人工智能教程】
在这里插入图片描述

文章目录

  • 一、异常处理
    • 1. 基本概念
    • 2. 示例代码
    • 3. 注意事项
  • 二、常见的异常类
    • 1. 继承自`std::exception`的基类
    • 2. 逻辑错误(`std::logic_error`派生)
    • 3. 运行时错误(`std::runtime_error`派生)
    • 4. 特定于内存和类型转换的异常
    • 5. 自定义异常类
    • 6. 使用异常类的示例
  • 三、相关链接

一、异常处理

C++ 异常处理是一种错误处理机制,它允许程序在运行时检测和处理错误情况。这种机制通过使用 trycatchthrow 关键字来实现。当函数遇到无法处理的错误时,它会抛出一个异常(通过 throw 关键字),这个异常可以被调用者捕获并处理(通过 catch 块)。如果没有被捕获,异常会传播到更高层的调用者,直到被捕获或导致程序终止。

1. 基本概念

  • throw:用于抛出一个异常。它可以抛出 C++ 中的任何类型,但通常是抛出一个从标准异常类派生的对象。
  • try:用于指定代码块,当块内发生异常时,程序的控制流会跳转到与之关联的 catch 块。
  • catch:用于捕获并处理异常。catch 块可以紧跟在 try 块之后,并且可以有多个 catch 块来捕获不同类型的异常。

2. 示例代码

#include <iostream>
#include <stdexcept> // 包含标准异常类void func() {// 假设这里发生了一个错误throw std::runtime_error("发生了一个运行时错误!");
}int main() {try {func(); // 调用func,它可能会抛出一个异常} catch (const std::runtime_error& e) {// 捕获到runtime_error异常std::cerr << "捕获到异常: " << e.what() << std::endl;} catch (...) {// 捕获所有其他类型的异常std::cerr << "捕获到未知异常" << std::endl;}return 0;
}

3. 注意事项

  1. 异常规格:在 C++11 之前,函数可以声明它可以抛出的异常类型(异常规格)。但从 C++11 开始,非抛出异常规格(throw())被废弃,并且在 C++17 中被完全移除。现代 C++ 代码通常不再使用异常规格。
  2. 资源泄露:在使用异常处理时,要特别注意资源管理,防止资源泄露。一种常见的方法是使用 RAII(Resource Acquisition Is Initialization)技术,通过智能指针(如 std::unique_ptrstd::shared_ptr)来自动管理资源。
  3. 异常层次结构:在设计自定义异常时,应该继承自标准异常类(如 std::exception),这有助于维护清晰的异常层次结构,并允许调用者更容易地处理异常。
  4. 避免在析构函数中抛出异常:在析构函数中抛出异常可能会导致程序崩溃,因为析构函数是在处理异常的过程中被调用的。如果析构函数需要处理错误情况,它应该采用其他错误处理机制(如记录错误日志或设置错误状态码)。
  5. 性能考虑:虽然异常处理提供了强大的错误处理机制,但它可能会对性能产生负面影响。因此,在性能敏感的代码区域中,应该谨慎使用异常处理,并考虑使用其他错误处理机制(如错误码和错误状态)。

二、常见的异常类

C++中常见的异常类主要包括标准异常类和自定义异常类。标准异常类是由C++标准库提供的,用于表示各种常见的错误情况。以下是一些常见的标准异常类:

1. 继承自std::exception的基类

  • std::exception:所有标准异常的基类,提供了基本的异常接口,包括what()函数,该函数返回一个表示异常的字符串指针。

2. 逻辑错误(std::logic_error派生)

逻辑错误是在程序运行前可以检测出来的错误,它们通常是由于程序内部的逻辑问题导致的。

  • std::domain_error:当函数的参数值不在其允许的有效范围内时抛出。
  • std::invalid_argument:指出函数的一个无效参数。
  • std::length_error:当尝试生成一个超出该类型最大长度的对象时抛出。
  • std::out_of_range:当使用一个超出有效范围的值时抛出,如在数组或字符串中采用了一个错误的索引。

3. 运行时错误(std::runtime_error派生)

运行时错误是在程序运行过程中才能检测到的错误。

  • std::range_error:当内部计算时发生区间错误时抛出。
  • std::overflow_error:当算术运算结果超出可表示的最大值时抛出。
  • std::underflow_error:当算术运算结果超出可表示的最小值时抛出。

4. 特定于内存和类型转换的异常

  • std::bad_alloc:当new操作无法分配足够的内存时抛出。
  • std::bad_cast:在运行时类型识别中有一个无效的dynamic_cast表达式时抛出。
  • std::bad_typeid:当对空指针使用typeid操作时抛出。

5. 自定义异常类

除了上述标准异常类外,程序员还可以根据需要创建自定义异常类。自定义异常类通常通过继承自std::exception或某个更具体的标准异常类来实现,以便提供额外的错误信息或特定的行为。

6. 使用异常类的示例

#include <iostream>
#include <stdexcept>int main() {try {// 假设这里有一段可能抛出异常的代码if (/* 某种错误条件 */) {throw std::invalid_argument("无效的参数");}} catch (const std::invalid_argument& e) {std::cerr << "捕获到异常: " << e.what() << std::endl;} catch (...) {std::cerr << "捕获到未知异常" << std::endl;}return 0;
}

在编写C++程序时,合理使用异常处理机制可以提高程序的健壮性和可维护性。通过抛出和捕获异常,程序可以在遇到错误时优雅地处理,而不是突然崩溃或产生未定义的行为。
在这里插入图片描述

三、相关链接

  1. Visual Studio Code下载地址
  2. Sublime Text下载地址
  3. 「C++系列」C++简介、应用领域
  4. 「C++系列」C++ 基本语法
  5. 「C++系列」C++ 数据类型
  6. 「C++系列」C++ 变量类型
  7. 「C++系列」C++ 变量作用域
  8. 「C++系列」C++ 常量知识点-细致讲解
  9. 「C++系列」C++ 修饰符类型
  10. 「C++系列」一篇文章说透【存储类】
  11. 「C++系列」一篇文章讲透【运算符】
  12. 「C++系列」循环
  13. 「C++系列」判断
  14. 「C++系列」函数/内置函数
  15. 「C++系列」数字/随机数
  16. 「C++系列」数组
  17. 「C++系列」字符串
  18. 「C++系列」指针
  19. 「C++系列」引用
  20. 「C++系列」日期/时间
  21. 「C++系列」输入/输出
  22. 「C++系列」数据结构
  23. 「C++系列」vector 容器
  24. 「C++系列」类/对象
  25. 「C++系列」继承
  26. 「C++系列」重载运算符/重载函数
  27. 「C++系列」多态
  28. 「C++系列」数据抽象
  29. 「C++系列」数据封装
  30. 「C++系列」 接口(抽象类)
  31. 「C++系列」文件和流

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

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

相关文章

三维天地创新方案助力实验室信息自动化技术深入发展

实验室环境条件控制非常重要,它直接影响着最终的实验或检测结果。例如不同的实验室对于温湿度有不同的要求,这就给实验室温湿度监测与采集带来了一定的困难。 三维天地自主研发的实验室信息管理系统(SW-LIMS)提出了一种检化验记录温湿度自动采集的创新方案,这一方案致力于实现…

一键文本提示实现图像对象高质量剪切与透明背景生成

按照提示词裁剪 按照边框裁剪 要实现您描述的功能,即通过一个文本提示就能自动从图片中切割出指定的对象并生成一个带有透明背景的新图像,这需要一个结合了先进的计算机视觉技术和自然语言处理能力的系统。这样的系统可以理解输入的文本指令,并将其转化为对图像内容的精确分…

解决nginx代理SSE接口的响应没有流式返回

目录 现象原来的nginx配置解决 现象 前后端分离的项目&#xff0c;前端访问被nginx反向代理的后端SSE接口&#xff0c;预期是流式返回&#xff0c;但经常是很久不响应&#xff0c;一响应全部结果一下子都返回了。查看后端项目的日志&#xff0c;响应其实是流式产生的。推测是n…

大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Markdown书写技巧深度解析

引言 在数字化时代&#xff0c;文本编辑与格式化的效率与美观性显得尤为重要。Markdown&#xff0c;作为一种轻量级的标记语言&#xff0c;以其简洁的语法和高效的文档转换能力&#xff0c;在多个领域得到广泛应用。本文将全面探讨Markdown的由来、定义、原理、内部流程、应用场…

构建自己的文生图工具:Python + Stable Diffusion + CUDA

构建自己的文生图工具&#xff1a;Python Stable Diffusion CUDA 前言概述环境搭建安装PyTorch安装Stable Diffusion编写Python代码结论结语 前言 在这个数字化和人工智能飞速发展的时代&#xff0c;图像生成技术正逐渐成为现实。想象一下&#xff0c;只需输入几个关键词&…

el-form动态标题和输入值,并且最后一个输入框不校验

需求&#xff1a;给了固定的label&#xff0c;叫xx单位&#xff0c;要输入单位的信息&#xff0c;但是属性名称都一样的&#xff0c;UI画图也是表单的形式&#xff0c;所以改为动态添加的形式&#xff0c;实现方式也很简单&#xff0c;循环就完事了&#xff0c;连着表单校验也动…

探索Facebook的黑暗面:数字化社交的双面剑

Facebook作为全球最大的社交平台&#xff0c;改变了我们的沟通和互动方式。虽然它带来了便利&#xff0c;但也存在不少隐忧。本文将探讨Facebook的负面影响&#xff0c;包括隐私问题、信息操控、心理健康危机及社交表面化等。 一、隐私问题&#xff1a;数据收集的隐忧 Facebo…

2024蓝桥杯省B好题分析

题解来自洛谷&#xff0c;作为学习 目录 宝石组合 数字接龙 爬山 拔河 宝石组合 # [蓝桥杯 2024 省 B] 宝石组合## 题目描述在一个神秘的森林里&#xff0c;住着一个小精灵名叫小蓝。有一天&#xff0c;他偶然发现了一个隐藏在树洞里的宝藏&#xff0c;里面装满了闪烁着美…

乐vs悲观锁,重vs轻量级锁,公vs非公平锁,不vs可重入锁,等等锁策略

这里讲的“乐观锁”“悲观锁”“轻量级锁”等等&#xff0c;都不是一个锁&#xff0c;而是一类锁。 比如&#xff1a;我们班有“带眼镜”的同学&#xff0c;这里“带眼镜”并不是指一个人&#xff0c;而是指一类人。 并且这里的锁&#xff0c;并不局限于Java&#xff0c;而是只…

优化数据的抓取规则:减少无效请求

在爬取房价信息的过程中&#xff0c;如何有效过滤无效链接、减少冗余请求&#xff0c;是提升数据抓取效率的关键。本文将介绍如何优化爬虫抓取贝壳等二手房平台中的房价、小区信息&#xff0c;并通过代理IP、多线程、User-Agent和Cookies的设置&#xff0c;确保数据抓取的稳定性…

(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标&#xff1a; windows中&#xff0c;打开chromium&#xff0c;任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角&#xff0c;加上"有1条新消息"的小提示图标&#xff0c;也叫徽章(badge)注意&#xff1a;本章节纯属娱乐&#xff0c;有需要…

手脱简单upx

大一下的事情&#xff0c;补个档 手动脱壳の新年快乐 查壳&#xff0c;有壳&#xff0c;UPX X32dbg打开文件&#xff0c;查看初始断点 点击PUSHAD跟进&#xff0c;CTRL*设置EIP&#xff0c;开始F8步过&#xff0c;寻找ESP寄存器第一次单个变红的地址 此时的内存窗口 开始步过…

esp32核心跑分程序

https://github.com/ochrin/coremark/tree/esp32 最近一直捣腾esp32s3 (Sense) 做微型摄像。过程中发现一款不错的跑分软件&#xff0c;特此记一笔。 其中针对esp32s3各类参数设定&#xff08;用idf.py menuconfig)&#xff0c;做个记录。 CPU Frequency去240MHz&#xff08…

【H2O2|全栈】关于CSS(6)CSS基础(五)

目录 CSS基础知识 前言 准备工作 网页项目规范 创建项目 布局 补充一部分属性 outline border-radius 预告和回顾 后话 CSS基础知识 前言 本系列博客将分享层叠样式表&#xff08;CSS&#xff09;有关的知识点。 本期博客主要分享的是网页项目规范&#xff0c;ou…

VC++以资源方式打开可执行文件

刚看一个资料说可以在VC中&#xff0c;以资源方式打开可执行文件&#xff0c;然后它如果包含对话框一些资源&#xff0c;会呈现出来&#xff0c;可以把其他程序界面上的控件直接拷贝到自己程序&#xff1b; 但是操作了一下没有成功&#xff0c; 先新建一个空对话框准备拷贝东…

Linux运维篇-服务器简介

目录 前言服务器分类&#xff08;按服务器的机箱结构来划分&#xff09;台式服务器机架式服务器刀片式服务器 外观部件内部结构前面板前面板组件前面板接口说明前面板指示灯和按钮前面板指示灯/按钮说明 后面板后面板组件后面板接口说明后面板指示灯后面板指示灯说明 主板和 iB…

uni-app生命周期(三)

文章目录 一、uni-app的生命周期二、应用生命周期三、页面的生命周期函数1.简介2.页面加载时序介绍3.页面加载常见问题4.页面加载顺序4.部分生命周期介绍 四、组件的生命周期函数 一、uni-app的生命周期 应用生命周期&#xff08;整个App的生命周期&#xff09; 在app.vue里面…

C++之仿函数和虚函数

仿函数&#xff08;Functor&#xff09;和虚函数&#xff08;Virtual Function&#xff09;是 C 中两个不同的概念&#xff0c;它们在功能和使用场景上有显著的区别。 1. 仿函数&#xff08;Functor&#xff09; 定义&#xff1a; 仿函数&#xff08;也称为函数对象&#xf…

酒店布草洗涤-酒店分层管理编程实现--———未来之窗行业应用跨平台架构

一、添加楼层代码 未来之窗_人工智能_传送阵(添加楼层,客户信息,300,200) CyberWin_Dialog.layer(未来之窗传送,{type:"url",title:title,move:true,width:阵眼宽度"px",height:阵眼高度"px",id:未来之窗app_通用ID,mask:false,align:59,hidecl…