C++-异常处理

news2025/1/11 0:01:44

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.coloradmin.cn/o/1360600.html

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

相关文章

算法每日一题:队列中可以看到的人数 | 单调栈

大家好&#xff0c;我是星恒 今天是一道困难题&#xff0c;他的题解比较好理解&#xff0c;但是不好想出来&#xff0c;接下来就让我带大家来捋一捋这道题的思路&#xff0c;以及他有什么特征 题目&#xff1a;leetcode 1944有 n 个人排成一个队列&#xff0c;从左到右 编号为 …

【面试高频算法解析】算法练习6 广度优先搜索

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯&#xff08;Backtracking&…

使用Python给图片加水印(通过OpenCV和Pillow实现,内含完整代码链接)

from PIL import Image, ImageFont, ImageDraw, ImageEnhance, ImageChops import cv2 import math import numpy as npdef crop_image(im):"""裁剪图片边缘空白"""bg Image.new(mode"RGBA", sizeim.size)bbox ImageChops.differenc…

vite + vue3引入ant design vue 报错

npm install ant-design-vue --save下载插件并在main.ts 全局引入 报错 解决办法一&#xff1a; main.ts注释掉全局引入 模块按需引入 解决办法二 将package.json中的ant-design-vue的版本^4.0.0-rc.4改为 ^3.2.15版本 同时将将package-lock.json中的ant-design-vue的版本…

打造私域流量的知识付费小程序saas租户平台

当今信息爆炸的时代&#xff0c;知识管理已经成为了每个人必须面对的问题。然而&#xff0c;市面上的知识付费平台大多数都是通用的&#xff0c;无法满足个性化需求。 因此&#xff0c;明理信息科技提供了一款专属定制的适合个人的知识付费平台。核心产品能力如下&#xff1a;…

Huggy Lingo: 利用机器学习改进 Hugging Face Hub 上的语言元数据

太长不看版: Hub 上有不少数据集没有语言元数据&#xff0c;我们用机器学习来检测其语言&#xff0c;并使用 librarian-bots 自动向这些数据集提 PR 以添加其语言元数据。 Hugging Face Hub 已成为社区共享机器学习模型、数据集以及应用的存储库。随着 Hub 上的数据集越来越多&…

git打tag以及拉取tag

场景&#xff1a;某次git代码发布后定版记录&#xff0c;将发版所在的commit时候代码打上tag记录&#xff0c;方便后期切换到对应tag代码位置。 查看所有tag名 git tag// 1.1.0 // 1.0.0查看tag和描述 git tag -l -n//1.0.0 云监管一期项目完结 //1.1.0 …

tcl 基础

exec catch file mkdir

使用爬虫爬取热门电影

文章目录 网站存储视频的原理M3U8文件解读网站分析代码实现 网站存储视频的原理 首先我们来了解一下网站存储视频的原理。 一般情况下&#xff0c;一个网页里想要显示出一个视频资源&#xff0c;必须有一个<video>标签&#xff0c; <video src"xxx.mp4"&…

第8课 将推流端与播放端合并为一对一音视频聊天功能

在第二章的第7课&#xff0c;我们实现了一个推流端&#xff0c;可以把音视频推送到rtmp服务器&#xff1b;在第一章的第4课&#xff0c;我们实现了一个播放器&#xff0c;可以正常播放rtmp音视频流。聪明的你应该可以想到了&#xff1a;把推流端和播放端合并在一起&#xff0c;…

求实创新 不断探索 浙江移动基于亚信科技AntDB数据库率先完成CRM系统全域改造

12日20日&#xff0c;中国信息通信研究院&#xff08;简称&#xff1a;信通院&#xff09;和中国通信标准化协会大数据库技术推进委员会&#xff08;CCSA TC601&#xff09;共同组织的2023年大数据库“星河&#xff08;Galaxy&#xff09;”案例评选结果发布。中国移动通信集团…

2024年天津体育学院专升本专业考试考生入场及考前须知

天津体育学院2024年高职升本科招生专业考试考生考前须知 一、考生入场及考试要求 1.考生于1月6日笔试考试当天&#xff0c;根据考试时间提前30分钟到达天津体育学院新校区东门&#xff0c;凭专业考试准考证、有效身份证原件&#xff0c;经查验合格后方可允许进入学校。 2.笔…

Java反射篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、实现Java反射的类:二、反射机制的优缺点:三、Java 反射 API前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、实现…

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

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

海盗传说^^

欢迎来到程序小院 海盗传说 玩法&#xff1a;海盗版俄罗斯方块&#xff0c;上键 ↑变换、 左键 ← 左移、右键 → 右移、下键 ↓ 加速, 快去玩海盗版俄罗斯方块吧^^。开始游戏https://www.ormcc.com/play/gameStart/240 html <canvas id"canvas" moz-opaque>&…

Scrum的工件

我们采用了Scrum进行开发方面的管理&#xff0c;那么所有的计划和工作都应该是透明的&#xff0c;这给了我们检查这些东西的机会&#xff0c;以便能够即时做出调整来适应即将发生的变化。 那么Scrum为我们设计了一些工件帮助我们检查我们的工作和计划&#xff0c;每个工件都有…

Chinese-llama-2部署踩坑记录

Chinese-llama-2部署踩坑记录 1. Chinese-LLaMA-Alpaca-2A. 部署a. inference_with_transformers_zhb. text generation webui_zhc. api_calls_zhd. llamacpp_zhe. privategpt_zhf. langchain_zh Tool Github 1. Chinese-LLaMA-Alpaca-2 A. 部署 a. inference_with_transform…

L1-085:试试手气

我们知道一个骰子有 6 个面&#xff0c;分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态&#xff0c;即它们朝上一面的点数&#xff0c;让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙&#xff0c;每次摇出的结果都满足以下两个条件&#xff1a; 1、每个骰子摇出…

Fontfabric:一款字体与设计的完美结合

一、产品介绍 Fontfabric是一款由国际字体设计公司Fontfabric开发的字体设计软件。它提供了一整套完整的字体设计工具&#xff0c;让用户可以轻松地创建、设计和定制自己的字体。Fontfabric拥有丰富的字体库&#xff0c;包括各种风格和类型&#xff0c;能够满足用户在不同场景…

【论文阅读笔记】医学多模态新数据集-Large-scale Long-tailed Disease Diagnosis on Radiology Images

这是复旦大学2023.12.28开放出来的数据集和论文&#xff0c;感觉很宝藏&#xff0c;稍微将阅读过程记录一下。 Zheng Q, Zhao W, Wu C, et al. Large-scale Long-tailed Disease Diagnosis on Radiology Images[J]. arXiv preprint arXiv:2312.16151, 2023. 项目主页&#xf…