从0开始C++(十):异常处理——throw、try-catch、标准异常体系与粗略捕获

news2024/11/25 10:59:39

目录

概念

抛出异常(throw)

捕获异常(try - catch)

标准异常体系

自定义异常

多重捕获

粗略捕获


概念

异常是程序在执行期间产生的问题,C++异常是指在程序运行时发生的特殊情况,比如下所示的范围越界等。

异常提供了一种转移控制权的方式。

程序一旦出现没有经过处理的异常,就会造成程序运行崩溃。

异常处理机制可以帮助开发人员在程序发生异常时进行适当的处理,以确保程序可以正常执行或提供错误信息。

C++的异常处理通过使用 try 、catch throw 关键字来实现。 try 块用于包含可能引发异常的代码,而 catch 块用于捕获并处理异常。 throw 关键字用于引发异常。

注意,在使用异常处理时,我们应该遵循以下几点:

  1. 只在真正需要时使用异常处理,不要滥用异常。
  2. 不要在循环或频繁调用的代码块中使用异常处理,以避免性能问题。
  3. 在 catch 块中应尽量提供详细的错误信息,以帮助调试和诊断问题。

抛出异常(throw)

使用 throw 关键字可以抛出异常。throw 关键字后面可以跟着一个表达式,该表达式的结果将被当作异常对象。

以下是一个示例,演示如何使用 throw 抛出异常:

double divide(double a, double b) {
    if (b == 0) {
        throw "Divide by zero exception";
    }
    
    return a / b;
}

在上述示例中,我们定义了一个 divide 函数,用于计算两个数的商。在函数内部,我们检查除数是否为零。如果除数为零,则使用 throw关键字抛出一个字符串异常对象。

捕获异常(try - catch)

在C++中,我们可以使用 try-catch块来捕获异常。try块用于包含可能引发异常的代码,而catch块用于处理捕获的异常。

以下是一个示例,演示如何使用try-catch捕获异常:

#include <iostream>

double divide(double a, double b) {
    if (b == 0) {
        throw "Divide by zero exception";
    }
    
    return a / b;
}

int main() {
    try {
        double result = divide(10, 0);

        std::cout << "Result: " << result << std::endl;
    } catch (const char* error) {
        std::cout << "Error: " << error << std::endl;
    }
    
    return 0;
}

在上述示例中,我们定义了一个divide函数,用于计算两个数的商。在函数内部,我们检查除数是否为零。如果除数为零,则使用throw关键字抛出一个字符串异常对象。

main函数中,我们将调用divide函数放在一个try块中。如果在try块中的代码引发了异常,控制流会立即跳转到匹配的catch块,并执行其中的代码。在这个示例中,我们使用catch (const char* error)来捕获字符串异常对象,并在catch块中输出错误信息。

注意,在catch块中,我们可以使用不同类型的参数来捕获不同类型的异常对象。在上述示例中,我们使用了const char*来捕获异常对象,因为我们抛出的异常是一个字符串。

如果没有匹配的catch块来处理异常,异常将继续向上层调用栈传播,直到找到一个匹配的catch块或者到达程序的入口点(main函数)。如果一直没有找到匹配的catch块,程序将终止并显示一个未处理异常的错误消息。

标准异常体系

C++标准异常体系定义了一组异常类,用于以统一的方式处理异常情况。这些异常类都派生自基类std::exception,该基类定义了一些通用的操作和成员函数,如what()函数用于返回异常的描述信息。

  class exception
  {
  public:
    exception() _GLIBCXX_USE_NOEXCEPT { }
    virtual ~exception() _GLIBCXX_USE_NOEXCEPT;

    /** Returns a C-style character string describing the general cause
     *  of the current error.  */
    virtual const char* what() const _GLIBCXX_USE_NOEXCEPT;
  };

C++标准异常体系中的异常类包括:

  1. std::bad_alloc:内存分配失败时 抛出的异常。
  2. std::bad_cast:类型转换失败时 抛出的异常。
  3. std::bad_exception:在处理异常时 抛出的异常。
  4. std::bad_typeidtypeid操作符获取类型信息失败时 抛出的异常。
  5. std::logic_error:由程序逻辑错误 引起的异常,包括std::invalid_argumentstd::domain_errorstd::length_errorstd::out_of_range等异常。
  6. std::runtime_error:在运行时发生的异常,包括std::range_errorstd::overflow_errorstd::underflow_error等异常。

自定义异常

 除了以上这些标准异常类,还可以自定义异常类,只需派生自std::exception即可,需要添加头文件 #include<stdexcept>

一个抛出自定义异常的例子:

#include <iostream>
#include <stdexcept>
using namespace std;


class MyException :public exception
{
public:
    // 覆盖what函数
    // throw():异常规格说明
    // 表示此函数不会出现任何异常的抛出
    const char* what() const throw()
    {
        return "自定义类型异常";
    }
};

void show(string a,string b)
{
    if(a == "#" || b == "#")
    {
        throw MyException();
    }
    cout << a << b << endl;
}
int main()
{
    cout << "请输入两个字符串" << endl;
    string a;
    string b;
    cin >> a >> b;
    try
    {
        show(a,b);
    }
    catch(MyException &e)
    {
        cout << "返回异常信息:" << e.what() << endl;
    }
    cout << "您输入的是:" << a << b << endl;
    return 0;
}

多重捕获

在C++中,可以使用多重异常捕获来处理不同类型的异常。多重异常捕获允许在同一个try块中捕获多个不同类型的异常,并执行相应的处理操作。

多重异常捕获的语法如下所示:

try {
    // 代码块
}
catch (ExceptionType1 ex) {
    // 处理类型为ExceptionType1的异常
}
catch (ExceptionType2 ex) {
    // 处理类型为ExceptionType2的异常
}
// 可以添加更多的catch块
catch (...) {
    // 处理其他类型的异常
}

try块中的代码可能会抛出不同类型的异常,每一个catch块都会尝试捕获指定的异常类型。当发生异常时,C++会按照catch块的顺序来匹配异常类型,如果找到匹配的catch块,则执行相应的处理操作。

请注意以下几点:

  1. 异常类型需要与catch块中指定的类型相匹配,包括派生类型(多态)。
  2. catch块的顺序很重要,应该按照从特定到一般的顺序排列。
  3. 可以添加多个catch块来处理不同类型的异常。
  4. 可以使用省略号 ...来捕获其他未被前面的catch块捕获的异常,通常在最后一个catch块中使用。

通过多重异常捕获,可以灵活地处理不同类型的异常,确保程序在遇到异常时能够进行适当的处理操作。

粗略捕获

粗略异常捕获(也称为粗糙的异常处理)是通过catch块捕获异常,除了可以直接捕获异常类型外,也可以捕获异常的基类,甚至所有异常类型。粗略异常捕获使用省略号...作为异常类型,可以捕获任何类型的异常。

以下是C++中粗略异常捕获的语法:

try {
    // 代码块
}
catch (...) {
    // 处理所有类型的异常
}

try块中的代码可能会抛出任何类型的异常,当发生异常时,粗略异常捕获的catch块会捕获并处理异常。您可以在catch块中执行适当的操作,如输出错误信息、记录日志或进行其他处理。

粗略异常捕获应该在某些情况下使用,例如当您希望在程序遇到任何类型的异常时都能进行某种处理时。然而,粗略异常捕获会损失异常的详细信息,因此在一般情况下,更推荐使用多重异常捕获来处理不同类型的异常,以便根据异常类型采取相应的处理方式。

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

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

相关文章

Spring Boot中实现定时任务最常用的方法 @Scheduled 注解和 TaskScheduler 接口【包含详情代码】

Spring Boot中实现定时任务最常用的方法 Scheduled 注解和 TaskScheduler 接口【包含详情代码】 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中………

「51媒体」政企活动媒体宣发如何做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 政企活动媒体宣发是一个系统性的过程&#xff0c;需要明确…

[数据集][目标检测]金属架螺栓螺丝有无检测数据集VOC+YOLO格式857张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;857 标注数量(xml文件个数)&#xff1a;857 标注数量(txt文件个数)&#xff1a;857 标注类别…

SAP ALV 负号提前

FUNCTION CONVERSION_EXIT_ZSIGN_OUTPUT. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" REFERENCE(INPUT) *" EXPORTING *" REFERENCE(OUTPUT) *"…

统信桌面操作系统上使用命令行添加软件图标到任务栏

原文链接&#xff1a;统信桌面操作系统上使用命令行添加软件图标到任务栏 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在统信桌面操作系统上使用命令行添加软件图标到任务栏的文章。通过命令行将常用软件的图标添加到任务栏&#xff0c;可以快速启动软件&#xf…

Links: Challenging Puzzle Game Template(益智游戏模板)

链接:挑战益智游戏 《Links》是一款独特且具有挑战性的益智游戏,即将发布。 每个级别都会向玩家展示不同的棋盘。目标是通过移动和旋转所有棋子来连接它们。每个棋子都有自己的特点和功能-你可以移动它们,旋转它们,或者两者兼而有之。连接所有棋子,以解决难度和挑战不断增…

吹爆这8款AI工具,好用到打耳光!

一、Snapseek-后台自动屏幕截图软件 Snapseek 是一款安卓端的后台自动屏幕截图软件&#xff0c;专为无缝后台存档你选择的应用程序而设计。一旦你指定了监控的应用程序&#xff0c;Snapseek 就会不断捕获图像&#xff0c;并利用 OCR&#xff08;光学字符识别&#xff09;技术进…

LabVIEW电涡流检测系统

开发了一种基于LabVIEW的软件与硬件结合的电涡流检测系统&#xff0c;通过同步采样技术和编码器的协同工作&#xff0c;显著提高了大型结构物的损伤检测精度和效率&#xff0c;具有良好的应用前景和实用价值。 项目背景 传统的手持式电涡流检测方法因其速度慢、灵敏度低、准确…

【教程】安装DGL/PyG图神经网络编程环境

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 关于cuda的安装&#xff0c;可以看这个&#xff1a; 【教程】保姆级安装NVIDIA CUDA、CUDNN环境全纪录解决SSH一段时间自动断开报Destination Host Un…

代码随想录第36天|动态规划

62. 不同路径 补充: 对二维数组的操作 dp[j][i] 表示到 j,i 有多少种路径递推公式: dp[j][i] dp[j - 1][i] dp[j][i - 1]初始化: dp[0][i] 和 dp[j][0] 都只有1种情况遍历顺序: 由于dp[j][i] 由 上和左的元素推导, 所以采用从左到右、从上到下的遍历顺序 class Solution {…

Redis高可用(主从复制、哨兵模式)详解

Redis高可用&#xff08;主从复制、哨兵模式&#xff09;详解 Redis是一种高性能的键值存储系统&#xff0c;能够通过多种机制来实现高可用性&#xff0c;这些机制主要包括主从复制&#xff08;Replication&#xff09;和哨兵模式&#xff08;Sentinel&#xff09;。 Redis 主…

使用 Python 注销、重启、关闭计算机

众所周知&#xff0c;Python 是一种功能强大的脚本语言。在本文中&#xff0c;将编写一个 Python 程序本控制计算机&#xff0c;实现计算机的注销、重启、关闭等操作。 Python 中的 os 模块&#xff0c;提供了一种与操作系统交互的方式&#xff0c;可以使用 os.system() 函数在…

Qt6.6编译Qt二维图形编辑器QVGE源码

QVGE是一个开源的多平台QtC编写的图形编辑器&#xff0c;可以用来画网络节点图&#xff0c;或者其他作用。 QVGE可以轻松创建和参数设定的小型到中型图形(1000节点/边缘)&#xff0c;共同的视觉特性的节点和边缘&#xff1a;形状、尺寸、颜色、标签等。定义(用户定义)属性的图表…

MQTT遗嘱信息(2)

接前一篇文章&#xff1a;MQTT遗嘱信息&#xff08;1&#xff09; 本文内容参考&#xff1a; 什么是MQTT遗嘱消息&#xff1f;如何配置和处理遗嘱消息&#xff1f;_mqtt last will-CSDN博客 MQTT 协议学习&#xff1a;Retained&#xff08;保留消息&#xff09; 与 LWT&#x…

实现矩阵乘法【矩阵乘法复杂度优化】

实现矩阵乘法【矩阵乘法复杂度优化】 题目描述&#xff1a;解题思路一&#xff1a;使用NumPy库解题思路二&#xff1a;三个for循环解题思路三&#xff1a;分块矩阵乘法, 利用多线程或多进程 题目描述&#xff1a; 实现矩阵乘法【矩阵乘法复杂度优化】 解题思路一&#xff1a;…

leetcode 动态规划(基础版)不同路径II

题目&#xff1a; 题解&#xff1a; 一种可行的方案是&#xff0c;因为障碍物无法到达也无法从障碍物过来&#xff0c;所以遇上障碍物时将对应的dp位置设为0即可&#xff0c;这样非常巧妙简单地解决了这个问题。 int uniquePathsWithObstacles(vector<vector<int>&g…

苏东坡传-读书笔记三

苏东坡去世之后&#xff0c;一黄某获得苏东坡一珍贵的手稿&#xff0c;其中有苏东坡下列的名句&#xff1a; “处贫贱易&#xff0c;处富贵难。安劳苦易&#xff0c;安闲散难。忍痛易&#xff0c;忍痒难。人能安闲散&#xff0c;耐富贵&#xff0c;忍痒&#xff0c;真有道之士也…

<sa8650>QCX 诊断模块和错误处理

<sa8650>QCX 诊断模块和错误处理 一、错误报告设计二、QCarCam API 的错误报告2.1 QCarCamRegisterEventCallback2.2 CarCamErrorInfo_t2.3 QCarCamErrorInfo_t2.4 Error ID2.4.1 QCARCAM_ERROR_WARNING2.4.2 QCARCAM_ERROR_SUBSYSTEM_FATAL2.4.3 QCARCAM_ERROR_FATAL2.4.4 Q…

傅里叶变换,拉普拉斯变换,卷积 卷积定理

傅里叶变换&#xff0c;拉普拉斯变换&#xff0c;卷积 & 卷积定理 文章目录 傅里叶变换&#xff0c;拉普拉斯变换&#xff0c;卷积 & 卷积定理开胃小菜&#xff08;收敛性&#xff09;一、傅里叶变换核心原理定义连续时间信号离散时间信号&#xff08;了解&#xff09;…

2毛钱的SOT23-5封装28V、1.5A、1.2MHz DCDC转换器用于LCD偏置电源和白光LED驱动等MT3540升压芯片

前言 之前发了一个TI的BOOST升压芯片&#xff0c;用于LCD偏置电压或LED驱动&#xff0c;请访问以下链接。 6毛钱SOT-23封装28V、400mA 开关升压转换器&#xff0c;LCD偏置电源和白光LED应用芯片TPS61040 国产半导体厂家发展迅猛&#xff0c;今天推荐一个公司带“航天”的升压…