C++-异常处理

1、概念

异常时程序在执行期间产生的问题。C++异常是指在程序运行时发生的特殊情况。比如string::at函数下标越界等。

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

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

处理异常的方式有:抛出异常(throw)和捕获异常(try - catch)

2、抛出异常-throw语句

可以使用throw语句在代码块中的任何地方抛出异常。

throw语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出异常的类型。

抛出的异常是抛出到函数调用的上一级。

#include <iostream>

using namespace std;

// 除法
double division(double a,double b)
{
    if(== 0)
    {
        string text("除数等于0!");
        throw text;//抛出一个异常:异常为除数为0
    }
    return a/b;
}
double input()
{
    cout << "input 开始执行" << endl;
    double a;
    double b;
    cout << "请输入两个浮点型:" << endl;
    cin >> a >> b;
    double c = division(a,b);   // 1 text对象在这(无人处理)
    cout << "input 执行结束" << endl;
    return c;
}


int main()
{
    cout << "程序开始执行" << endl;
    cout << input() << endl;    // 2 text对象又到这了(还是无人处理)
    cout << "程序执行结束" << endl;
    return 0;
}

3、捕获异常

如果有一个try代码块抛出一个异常,捕获异常使用catch代码块。

#include <iostream>
using namespace std;
// 除法
double division(double a,double b)
{
    if(== 0)
    {
        string text("除数等于0!");
        throw text; // 抛出一个异常
    }
    return a/b;
}
double input()
{
    cout << "input 开始执行" << endl;
    double a;
    double b;
    cout << "请输入两个浮点型:" << endl;
    cin >> a >> b;
    double c = 0;
    try // 尝试抛出一个异常
    {
        c = division(a,b);
    }
    catch(string &e)    // 尝试捕获一个异常(类型跟抛出的异常类型不符合,会出现捕获不到的情况)
    //catch(...)//捕获所有异常
    {
        // 验证异常类型对象
        cout << e << endl;
        // 补救措施
        return 0;
    }
    cout << "input 执行结束" << endl;
    return c;
}
int main()
{
    cout << "程序开始执行" << endl;
    cout << input() << endl;    // 2 text对象又到这了(还是无人处理)
    cout << "程序执行结束" << endl;
    return 0;
}

上述代码中可能会出现的几种情况:

  1. 无异常抛出,此时程序正常执行,不进入catch块。
  2. 异常抛出,正确捕获,此时程序进入catch块。
  3. 异常抛出,错误捕获(捕获类型不对),此时程序仍然会向上抛出寻求正确捕获,如果每一层都没有正确捕获,程序任然运行终止。
  4. 4、标准异常体系

#include<stdexcept>头文件

C++给常见的异常类型进行了定义和分类,引入#include<stdexcept>头文件后可以使用。

这个体系还是太薄弱了,因此可以对其进行拓展。

自定义一个类型,继承自某个异常类型即可。

一个标注捕获的例子:

#include <iostream>
#include <stdexcept>
using namespace std;
int main()
{
    string s = "helloworld";
    try
    {
        cout << s.at(100) << endl;//异常,下标越界
    }
    catch(out_of_range &e)
    {
        // 输出错误信息
        cout << e.what() << endl;

        // 补救措施
        cout << -1 << endl;
    }
    return 0;
}

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

#include <iostream>
#include <stdexcept>
using namespace std;
// 继承于exception
class MyException:public exception
{
public:
    // 覆盖what函数
    // throw():异常规格说明
    // 表示此函数不会出现任何异常的抛出
    const char* what() const throw()
    {
        return "自定义异常类型" ;
    }
};
void show(string a,string b)
{
    if(== "#" || 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;
}

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

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

相关文章

选择排序!!!基础排序详解 C语言版

目录 1.什么是选择排序 2.选择排序源代码 3.优化代码 1.什么是选择排序 这是一个选择排序的流程图&#xff0c;其实很简单&#xff0c;就是每次挑选数字中最小的作为第一个 &#xff0c;直到整个数据有序就结束了 顾名思义&#xff0c;选择&#xff0c;那就是选取&#xff0c…

css的一些属性

我们在写项目的时候&#xff0c;会遇到多种多样的样式&#xff0c;大部分都是由css来实现的&#xff0c;css可以让我们的页面更美观&#xff0c;css通常是配合HTML使用&#xff0c;代码较为简单! 下面我就给大家举几个较为常用的一些css属性。 1.CSS中怎样让元素圆角化&#…

【Axure高保真原型】树形表格_多选效果

今天和大家分享树形表格_多选效果的原型模板&#xff0c;点击树的箭头可以展开或者收起子节点&#xff0c;点击多选按钮可以选中或取消选择该行以及子级行内容&#xff0c;同时反选父级行内容&#xff0c;父级行内容能根据子级选中的数量自动反选&#xff0c;包括全选、半选和未…

听GPT 讲Rust源代码--compiler(24)

File: rust/compiler/rustc_target/src/spec/armv7_unknown_linux_uclibceabi.rs 该文件的作用是定义了ARMv7架构使用uClibc-eabi工具链时的目标环境配置。 在Rust中&#xff0c;针对不同的目标平台&#xff0c;需要提供对应的配置文件以确保正确地编译和链接代码。这些配置文件…

小红书投放策略分析,如何打造个性化内容?

作为一个发展多年的成熟内容平台&#xff0c;小红书不同于其他平台&#xff0c;其用户数与影响力&#xff0c;一直处于不断增长中。因而作为品牌方&#xff0c;想要充分得到平台的流量红利&#xff0c;就必须学会制定小红书投放策略。今天&#xff0c;我们和大家分享下小红书投…

PyQT5实现图像处理应用(含Windows7下完整打包方案)

目录 1、任务概述2、环境安装2.1 创建虚拟环境2.2 安装依赖库 3、程序开发3.1 框架搭建3.2 读取图像3.3 图像处理 4、打包部署5、小结 1、任务概述 本篇博文将通过PyQT5来实现一个简单的图像处理应用&#xff0c;并完成打包部署。 本文开发平台&#xff1a;Windows10 64位系统…

Python PDF处理模块pypdf库详解

概要 PDF&#xff08;Portable Document Format&#xff09;是一种常见的文档格式&#xff0c;广泛用于存储和共享文本和图像数据。在 Python 中&#xff0c;有许多库可以用于处理 PDF 文件&#xff0c;其中之一就是 PyPDF。PyPDF 是一个功能强大的库&#xff0c;它允许你读取…

Linux入门攻坚——11、Linux网络属性配置相关知识1

网络基础知识&#xff1a; 局域网&#xff1a;以太网&#xff0c;令牌环网&#xff0c; Ethernet&#xff1a;CSMA/CD 冲突域 广播域 MAC&#xff1a;Media Access Control&#xff0c;共48bit&#xff0c;前24bit需要机构分配&#xff0c;后24bit自己…

指针

1、基本用法 2、概念 在C语言中&#xff0c;内存单元的地址称为指针&#xff0c;专门用来存放地址的变量&#xff0c;有时对地址&#xff0c;指针和指针变量不区分&#xff0c;统称指针。&#xff08;地址指针&#xff09;

UV胶水与聚氯乙烯PVC材料的塑料粘接,效果如何?

UV胶水可以与聚氯乙烯PVC很好地粘接。 PVC是一种常见的塑料材料&#xff0c;UV胶水通常对PVC具有良好的粘接性能。UV胶水可以在紫外线照射下迅速固化&#xff0c;形成坚固的粘接&#xff0c;因此通常被用于PVC制品的粘接和修复。 UV胶水与PVC粘接的优点&#xff1a; 1. 快速固…

C++ UTF-8与GBK字符的转换 —基于Windows (MultiByteToWideChar WideCharToMultiByte)

1、UTF-8 和 GBK 的区别 GBK&#xff1a;通常简称 GB &#xff08;“国标”汉语拼音首字母&#xff09;&#xff0c;GBK 包含全部中文字符。 UTF-8 &#xff1a;是一种国际化的编码方式&#xff0c;包含了世界上大部分的语种文字&#xff08;简体中文字、繁体中文字、英文、…

零日攻击:经典的传说!

零日攻击 1. 什么是零日漏洞2. 什么是零日市场3. 如何将零日漏洞转化为零日攻击4. 零日攻击的主要目标5. 典型零日攻击事件 1. 什么是零日漏洞 零日攻击是指利用零日漏洞对系统或软件应用发动的网络攻击。 零日漏洞也称零时差漏洞&#xff0c;通常是指还没有补丁的安全漏洞…

面试之线程状态

1.线程有哪些状态 1.1Java线程的六种状态 Java 线程六种状态 新建 当一个线程对象被创建&#xff0c;但还未调用 start 方法时处于新建状态 此时未与操作系统底层线程关联 可运行 调用了 start 方法&#xff0c;就会由新建进入可运行 此时与底层线程关联&#xff0c;由操作…

【AI视野·今日Sound 声学论文速览 第三十七期】Tue, 31 Oct 2023

AI视野今日CS.Sound 声学论文速览 Tue, 31 Oct 2023 Totally 11 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers DCHT: Deep Complex Hybrid Transformer for Speech Enhancement Authors Jialu Li, Junhui Li, Pu Wang, Youshan Zhang当前大多数基于深…

神经网络框架的基本设计

一、神经网络框架设计的基本流程 确定网络结构、激活函数、损失函数、优化算法&#xff0c;模型的训练与验证&#xff0c;模型的评估和优化&#xff0c;模型的部署。 二、网络结构与激活函数 1、网络架构 这里我们使用的是多层感知机模型MLP(multilayer prrceptron)&#x…

代码随想录 1143. 最长公共子序列

题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也…

MongoDB 启动时:服务名无效

1.问题场景 电脑睡眠后&#xff0c;再连接服务发现无法连接&#xff0c;启动服务报&#xff1a;服务名无效。 2.打开服务管理&#xff1a; 发现服务中没有MongoDB的服务 3.解决 &#xff08;1&#xff09;先找打MongoDB安装路径&#xff0c;把data文件夹下所有文件删除 &a…

Vue中使用Element UI的Table组件实现嵌套表格(最简单示例)

以下是一个简单的示例代码&#xff0c;演示如何在Vue中使用Element UI的Table组件实现嵌套表格&#xff1a; html <template><div><el-table :data"tableData" style"width: 100%"><el-table-column prop"name" label&quo…

Centos服务器安装Certbot以webroot的方式定时申请SSL免费证书

最近发现原先免费一年的SSL证书都改为3个月的有效期了&#xff0c;原先一年操作一次还能接受&#xff0c;现在3个月就要手动续期整的太慢烦了&#xff0c;还是让程序自动给处理下吧&#xff0c; 安装 Certbot yum install epel-release -y yum install certbot -yEPEL是由 Fe…

云计算历年题整理

第一大题 第一大题计算 给出计算连接到EC2节点的EBS的高可用性(HA)的数学公式&#xff0c;如场景中所述&#xff1b;计算EC2节点上的EBS的高可用性(HA)&#xff1b;场景中80%的AWS EC2节点用于并行处理&#xff0c;总共有100个虚拟中央处理单元(vCPUs)用于处理数据&#xff0…
最新文章