c++异常处理exception

// c++中的异常处理
// 1.throw : 专门用于抛出异常,做出提示
// 2.try   : 尝试运行可能会异常的代码
// 3.catch : 用于接收前面跑出来的异常并进行解决

// 执行循序为:
// try
// {
//     throw ...; // 执行的代码中必须直接或者间接的有throw
// }
// catch在throw之后执行,catch执行的数据类型入参与throw抛出异常的数据类型一致
// catch(const std::exception& e)
// {
//     std::cerr << e.what() << '\n';
// }

// try
// {
//     do th1 ... (必须会执行的代码)
//     直接或间接有throw,
//     如果此处没有触发throw则会执行下文的do th2
//     如果此处有触发throw,则下文的do th2不会继续执行,而是之下下文中的chtch
//     因为如果触发throw,则do th2没有继续执行的必要
//     do th2 ... ()
// }
// // const std::exception& e为接收到的异常情况
// catch(const std::exception& e)
// {
//     // 异常处理
//     std::cerr << e.what() << '\n';
// }

// 以上的try catch可以层层嵌套使用
// 在 C++ 中,可以通过嵌套 `try-catch` 来处理更复杂的异常情况,即在一个 `try` 块中嵌套另一个 `try` 块。
// 在嵌套结构中,内部的 `try` 块可以处理外部 `try` 块无法处理的异常。
// 下面是一个嵌套 `try-catch` 的示例代码:
// try {
//     try {
//         // Block of code which may throw an exception
//     } catch (const SomeExceptionType& e) {
//         // Exception handling code for inner try block
//     }
//     // Block of code which may throw another exception
// } catch (const AnotherExceptionType& e) {
//     // Exception handling code for outer try block
// }
// 在上面的代码中,有两个 `try` 块,其中内部的 `try` 块包含一个代码块,可能会引发某种类型的异常。
// 如果在内部的 `try` 块中抛出异常,它将被内部的 `catch` 块捕获和处理。 
// 如果在内部的 `try` 块中未发生异常,则执行内部 `try` 块后的代码块。
// 如果在这个代码块中引发了异常,那么这个异常将被外部的 `catch` 块捕获和处理。
// 需要注意的是,如果一个 `catch` 块捕获了异常,它将防止此异常进一步传播到该代码块之外。
// 因此,如果一个 `catch` 块在处理异常时,抛出了另一个异常,则外部的 `catch` 块将无法捕获最初被抛出的异常,
// 也就是说,只有最内层的 `catch` 块可以捕获到抛出的异常。

// 注意:
// 只要有throw抛出了异常,后边就必须有catch就就收异常进行异常处理,这是语法规定。

#include <iostream>
#include <string>

using namespace std;

int test(int a, int b)
{
    // 当b==0时,正常的处理已经不能继续,必须进行异常处理
    if (b == 0.0)
    {
        // 有异常情况->需要通过throw进行报告
        // 通过throw + 抛出的异常信息;
        // 抛出的异常信息:支持多种类型
        throw "这里有问题!";
        // 第一个throw抛出异常后,后边的throw不会再继续执行,因为已经没有意义
        // 注意:throw不是return,如果这里有throw,则在后边的代码实现中必须要有catch进行异常处理
        throw 666;
        // 如果char数据类型报错信息后没有对应数据类型的catch处理函数,那么将会出现如下报错
        // terminate called after throwing an instance of 'char'
        // Aborted (core dumped)
        throw 'S';
        // 如果double数据类型报错信息后没有对应数据类型的catch处理函数,那么将会出现如下报错
        // terminate called after throwing an instance of 'char'
        // Aborted (core dumped)
        throw 3.14;
    }
    return a / b;
}

int main()
{
    // 异常情况,num没有初始化
    int num;
    int val = num;
    try
    {
        cout << test(9, 0) << endl;
    }
    // const std::exception& e参数类型为throw抛出异常时对应的参数类型
    // 参数 `const std::exception& e` 表示捕获任何派生自 `std::exception` 类的异常对象
    // `std::exception` 是 C++ STL 标准库中所有异常类型的基类,它定义了一些常用的成员函数和属性,
    // 例如 `what()` 函数,可以用于获取异常对象的描述信息。
    // 派生自 `std::exception` 的标准异常类包括 `std::runtime_error`、`std::logic_error` 和 `std::bad_alloc` 等。
    // 使用 `catch(const std::exception& e)` 的语法,表示捕获所有继承自 `std::exception` 的异常类型,
    // 以确保我们能够捕获可能发生的异常,并提供恰当的异常处理机制。
    // 需要注意的是,不是所有异常都派生自 `std::exception`,例如内存访问错误、空指针异常等异常就不属于该类型。
    // 此时,我们需要使用其他适当的异常类来捕获这些异常。
    // 另外,如果你想自定义异常,可以使用继承自 `std::exception` 的新类,并为它提供自己的行为和描述信息。
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
    // 此处catch处理的异常信息为throw抛出异常时的char *类型异常信息
    catch (const char * str) {
        cout << str << endl;
    }
    // 此处catch处理的异常信息为throw抛出异常时的int类型异常信息
    catch (int num) {
        cout << num << endl;
    }
    // "..."适配所有数据类型的异常信息
    // 比如上文中的throw 3.14;并没有对应的catch函数,
    // 那么如果throw 3.14;抛出将会在此处的catch (...)处理
    catch (...) {
        cout << "有问题" << endl;
    }

    return 0;
}

c++自定义异常来自于c++标准提供的类:

// c++自定义异常处理类
// 自定义异常处理语法格式:try { throw } catch (const MyExpection& obj) {}
#include <iostream>
#include <exception>

using namespace std;

// std::exception为c++标准异常处理的共同父类,可以使用该类派生出子类实现自定义异常处理
class MyExpection : public std::exception
{
public:
    // const char *what const {}
    // 以上定义方法会报错:
    // error: looser throw specifier for ‘virtual const char* MyExpection::what() const’
    // error:   overriding ‘virtual const char* std::exception::what() const noexcept’
    // what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT;
    // 这个错误是因为虚函数 `what()` 的异常规范(或 throw specifier)与被覆盖的基类中的不同导致的。
    // 异常规范告诉编译器,在函数抛出的异常类型方面可以期望什么。
    // 在这里,`const char* MyExpection::what() const` 声明的异常规范应该与 `std::exception::what()` 的规范保持一致。
    // 在 C++11 中,标准库异常类的 `what()` 声明是 `virtual const char* what() const noexcept`。
    // `noexcept` 告诉编译器,该函数不会抛出任何异常。
    // 因此,在自定义异常中,需要将 `what()` 函数的异常规范改为 `noexcept`,以与基类中的异常规范保持一致。
    // 此外,也可以忽略异常规范,这意味着函数可以抛出任何异常,包括派生自 `std::exception` 的异常类型。
    // 不过,需要注意的是,忽略异常规范可能会影响代码的可移植性,因为某些编译器可能依赖于异常规范进行一些优化。
    // 如果你决定忽略异常规范,请确保在实际编译器中测试你的代码。
    // 修复后的代码如下:
    const char *what() const noexcept override {
        return "exception !!!";
    }
};

int main()
{
    // 可以转到exception类中定义查看具体实现和使用接口
    MyExpection obj;
    cout << obj.what() << endl;

    try {
        throw MyExpection();
    } catch(const MyExpection& obj) {
        std::cerr << obj.what() << '\n';
    }

    return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图的创建和遍历

孤勇者探险&#xff08;图的遍历&#xff09; 作者 YJ 单位 西南石油大学 一款名为“孤勇者探险”的游戏&#xff0c;游戏中共有若干个小岛&#xff0c;每个岛上均有怪兽&#xff0c;闯关者打倒岛上的怪兽则可获得该岛对应的游戏积分&#xff08;每个岛的积分根据难度可能不相…

HALCON-从入门到入门-读取图片保存图片

1.废话 视觉算法库的第一步。 读取图片&#xff1a; 看你是从哪里读取&#xff0c;从相机读取还是从本地硬盘中读取。 保存图片&#xff1a;就只有保存到本地了。 上面的截图显示我读取了一张图片 从相机中读取另开一篇来说&#xff0c;先说从本地磁盘读取哈。 怎么读取的…

【Python数据分析--pandas学习笔记】Python数据分析库pandas详细学习笔记(内容详细,适合小白入门),数据分析学习笔记

一&#xff0c;pandas教程 1-1 pandas 安装 1-1-1 使用 pip 安装 pandas: pip install pandas安装成功后&#xff0c;我们就可以导入 pandas 包使用&#xff1a; import pandas1-1-2 查看 pandas 版本 >>> import pandas >>> pandas.__version__ # 查看…

《向量数据库指南》为什么要研发 Milvus Cloud?

许多 AI 应用都需要借助向量相似性搜索的力量来分析处理文本、图像、声音和视频等众多非结构化数据。典型的此类 AI 应用包括聊天机器人、购物助手等。而这些应用&#xff0c;尤其是 RAG 应用的 AI 开发栈中最核心的部分就是用于存储和搜索 Embedding 向量的向量数据库。 虽然业…

【C++】STL中vector常见功能的模拟实现

前言&#xff1a;在上一篇中我们讲到了Vector的一些常见功能的使用方式&#xff0c;今天为了进一步的去学习Vector和能够更深度的去理解Vector的一些底层的原理。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &…

自定义类型:结构体类型

在学习完指针相关的知识后将进入到c语言中又一大重点——自定义类型&#xff0c;在之前学习操作符以及指针时我们对自定义类型中的结构体类型有了初步的了解&#xff0c;学习了结构体类型的创建以及如何创建结构体变量&#xff0c;还有结构体成员操作符的使用&#xff0c;现在我…

[数据集][目标检测][数据集][目标检测]智能手机检测数据集VOC格式5447张

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;5447 标注数量(xml文件个数)&#xff1a;5447 标注类别数&#xff1a;1 标注类别名称:["phone"] 每个类别标注的框数&#xff…

WPF -> MVVM

1.1安装MVV MLight 打开 Visual Studio 2022。 在顶部菜单栏中选择“工具” -> “NuGet 包管理器” -> “程序包管理器控制台”。 在控制台中输入以下命令&#xff0c;并按回车键运行&#xff1a; Install-Package MvvmLightLibsStd104.等待安装完成后&#xff0c;你就…

man命令的作用

man命令是Linux操作系统中一个非常实用的命令&#xff0c;它用于查看命令的手册页面&#xff0c;帮助用户了解特定命令的用法、选项和参数。这不仅对新用户在学习如何使用新命令时很有帮助&#xff0c;也方便了经验丰富的用户快速查找命令的详细信息。以下是具体介绍&#xff1…

基于java18多端展示+ idea hbuilder+ mysql家政预约上门服务系统,源码交付,支持二次开发

基于java18多端展示 idea hbuilder mysql家政预约上门服务系统&#xff0c;源码交付&#xff0c;支持二次开发 家政预约上门系统是一种通过互联网或移动应用平台&#xff0c;为用户提供在线预约、下单、支付和评价家政服务的系统。该系统整合了家政服务资源&#xff0c;使用户能…

LeetCode 算法:无重复字符的最长子串c++

原题链接&#x1f517;&#xff1a;无重复字符的最长子串 难度&#xff1a;中等⭐️⭐️ 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所…

谷歌浏览器的平替,内置开挂神器,我已爱不释手!

油猴浏览器正式版是一款基于谷歌Chromium源码开发的浏览器&#xff0c;它集成了集成了强大的油猴扩展&#xff08;Tampermonkey&#xff09;&#xff0c;使得用户可以轻松安装各种脚本&#xff0c;从而增强网页浏览体验。提供了一个更加个性化和高效的浏览体验。 油猴扩展&…

【Python网络爬虫】详解python爬虫中URL资源抓取

&#x1f517; 运行环境&#xff1a;PYTHON &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

CS和msf的权限传递,利用mimikatz抓取win10明文密码

一、Cobaltstrike的安装 http://t.csdnimg.cn/yhZin 安装CobaltStrike&#xff0c;浏览博主的上篇文章即可&#xff01;&#xff01;&#xff01; 这里我在自己的本机win11上执行了Client去连接kali中的Server端&#xff0c;直接执行.cmd文件即可&#xff01;&#xff01;&…

AI智能语音机器人系统如何对接科大讯飞接口

关于AI语音机器人的介绍有很多&#xff0c;但是由于商业化&#xff0c;没有一个能真正说明白的&#xff0c;当然&#xff0c;我们搭建的AI智能机器人系统也是商业化的&#xff0c;毕竟业务是做这方面的&#xff0c;但是价格绝对是公道的&#xff0c;废话不多说了&#xff0c;我…

C++vector及其实现

第一个参数是类型(可以是自定义也可以是内置类型) 相当于生成一个该类型的数组 allocator是空间配置器 遍历 1.下标遍历 2.迭代器遍历 3.范围for 对象访问 有名对象访问 匿名对象访问 隐式类型转换 成员函数 sort 使用sort需要包含头文件algorithm eg. sort的使用非…

QA 未能打开位于 D:/Computer999/Computer999.vbox 的虚拟电脑

前言 未能打开位于 xxx/Computer999.vbox 的虚拟电脑&#xff0c;并提示E_INVALIDARG (0X80070057)&#xff0c;是最常见的一个错误&#xff0c;下面是解决办法。 内容 1、提示下面的错误&#xff0c;注册Computer999失败&#xff1a; 未能打开位于 D:/Computer999/Compute…

【刷题(15】普通数组

一 普通数组基础 首先&#xff0c;我们根据下图先了解一下什么是前缀和。 既然我们明白了前缀和是怎么回事&#xff0c;那我们就来看一下我们该怎么输入 先给出答案&#xff0c;然后再给出分析。 答案&#xff1a; for (int i 1; i < n; i ){cin >> a[i];s[i] s…

JVM之垃圾回收面试总结

文章目录 1.GC概述1.1 什么是垃圾1.2 为什么需要GC&#xff1f;1.3 早期垃圾回收1.4 Java垃圾回收机制1.5 评估GC的性能指标 2.垃圾回收相关算法2.1 垃圾标记阶段的算法2.1.1 引用计数算法(Java没有使用)2.1.2 可达性分析算法 2.2 垃圾清除阶段的算法2.2.1 标记-清除(Mark-Swee…

今在推特发一个推特立马推特账户被删除了

咨询 Google Contacts 是如何 获取我的苹果手机通讯录的电话号码清单的&#xff1f;不到一分钟&#xff0c;我的账户之间被删除了&#xff0c;比停用、冻结还令人可怕。 立马推特账户被删除了。