C++_关于异常处理throw-try-catch

news2025/5/24 15:09:05

文章目录

  • 作用
    • 1. 无异常捕获
    • 2. 有异常捕获

作用

简单说,异常处理机制主要作用是让程序能够继续执行,或者以一种可控的方式终止,而非让程序因为错误直接崩溃

一个简单的动态数组类,来看看有异常捕获和无异常捕获的区别

1. 无异常捕获

先注释掉 main 函数中的 try-catch
输入数组元素个数 5 ,然后设置下标为 5 的元素值为任意整数,这里假设为111

#include <iostream>
#include <cstddef>    // size_t
#include <stdexcept>  // out_of_range
#include <cstdlib>    // rand exit
using namespace std;

class DynamicArray
{
private:
    int* m_arr;     // 动态分配内存
    size_t m_size;  // 数组大小
public:
    DynamicArray(size_t n = 1) :m_size(n)// 默认数组有一个元素
    {
        try
        {
            m_arr = new int[m_size]();  // 初始化为零    
        }
        catch (const bad_alloc& e)
        {
            cerr << "动态数组内存申请失败: " << e.what() << endl;
            exit(1);   // 如果内存分配失败,退出程序
        }
    }
    // 内存分配异常捕获放在构造函数里
    // 如果内存分配失败,程序就没有足够的资源来正常工作
    // 此时退出程序,给出友好的错误信息

    ~DynamicArray()
    {
        delete[] m_arr;  // 释放内存
    }

    // 获取数组大小
    size_t getSize() const
    {
        return m_size;  // 获取数组大小
    }

    // 设置指定位置的元素值
    void set(size_t index, int value)
    {
        if (index >= m_size)
        {
            throw out_of_range("越界");
           
        }
        m_arr[index] = value;
    }

    // 输出数组所有元素
    void print()
    {
        int i;
        for (i = 0; i < m_size; i++)
        {
            cout << m_arr[i] << "\t";
        }
        cout << "\n\n";
    }
};

int main() 
{
    srand(unsigned(time(NULL)));
    while (1)
    {
        cout << "请输入数组元素个数:";
        int n;
        cin >> n;
        DynamicArray  array(n);   // 动态数组对象
        int i;
        int x;


        //try  //对于可恢复的错误,抛出异常并让外部调用者来处理
        //{
            cout << "输入x 设置下标为x的元素值为111" << endl;
            cin >> x;
            array.set(x, 111);
        //}
        //catch (const out_of_range& e)
        //{
        //    cerr << "ERROR: " << e.what() << endl;
        //    continue;
        //}
    }   
    return 0;
}

在这里插入图片描述
程序直接运行中崩溃,中止

2. 有异常捕获

将 main 函数中的 try-catch 注释行恢复
输入数组元素个数 5 ,然后设置下标为 5 的元素值为任意整数,这里假设为111
当发生异常时(比如数组越界),程序不退出, continue 跳过当前循环并提示用户重新输入

#include <iostream>
#include <cstddef>    // size_t
#include <stdexcept>  // out_of_range
#include <cstdlib>    // rand exit
using namespace std;

class DynamicArray
{
private:
    int* m_arr;     // 动态分配内存
    size_t m_size;  // 数组大小
public:
    DynamicArray(size_t n = 1) :m_size(n)// 默认数组有一个元素
    {
        try
        {
            m_arr = new int[m_size]();  // 初始化为零    
        }
        catch (const bad_alloc& e)
        {
            cerr << "动态数组内存申请失败: " << e.what() << endl;
            exit(1);   // 如果内存分配失败,退出程序
        }
    }
    // 内存分配异常捕获放在构造函数里
    // 如果内存分配失败,程序就没有足够的资源来正常工作
    // 此时退出程序,给出友好的错误信息

    ~DynamicArray()
    {
        delete[] m_arr;  // 释放内存
    }

    // 获取数组大小
    size_t getSize() const
    {
        return m_size;  // 获取数组大小
    }

    // 设置指定位置的元素值
    void set(size_t index, int value)
    {
        if (index >= m_size)
        {
            throw out_of_range("越界");   // 抛出越界异常
           
        }
        m_arr[index] = value;
    }

    // 输出数组所有元素
    void print()
    {
        int i;
        for (i = 0; i < m_size; i++)
        {
            cout << m_arr[i] << "\t";
        }
        cout << "\n\n";
    }
};

int main() 
{
    srand(unsigned(time(NULL)));
    while (1)
    {
        cout << "请输入数组元素个数:";
        int n;
        cin >> n;
        DynamicArray  array(n);   // 动态数组对象
        int i;
        int x;

        try  //对于可恢复的错误,应该抛出异常并让外部调用者来处理
        {
            cout << "输入x 设置下标为x的元素值为111" << endl;
            cin >> x;
            array.set(x, 111);
        }
        catch (const out_of_range& e)
        {
            cerr << "ERROR: " << e.what() << endl;
            cout << "\n\n";
            continue;
        }
        array.print();
    }   
    return 0;
}

在这里插入图片描述

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

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

相关文章

LabVIEW氢同位素单质气体定量分装系统

氢同位素单质气体在多个行业中有重要应用&#xff0c;如能源和化工。传统的分装方法面临精度和自动化程度不足的问题。为此&#xff0c;开发了一套基于LabVIEW和质量流量控制器的定量分装系统&#xff0c;提高分装精度和效率&#xff0c;同时减少资源浪费和环境污染。 项目背景…

第427场周赛: 转换数组、用点构造面积最大的矩形 Ⅰ、长度可被 K 整除的子数组的最大元素和、用点构造面积最大的矩形 Ⅱ

Q1、转换数组 1、题目描述 给你一个整数数组 nums&#xff0c;它表示一个循环数组。请你遵循以下规则创建一个大小 相同 的新数组 result &#xff1a; 对于每个下标 i&#xff08;其中 0 < i < nums.length&#xff09;&#xff0c;独立执行以下操作&#xff1a; 如…

华为服务器使用U盘重装系统

一、准备工作 下载官方系统&#xff08;注意服务器CPU的架构是x86-64还是aarch64&#xff0c;不然可能报意想不到的错&#xff09;制作启动U盘&#xff08;下载rufus制作工具&#xff0c;注意文件系统选FAT32还是NTFS&#xff09; 二、安装步骤 将U盘插入USB接口重启服务器…

java八股-流量封控系统

文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制&#xff0c;比如 x 秒请…

Nginx限流实践-limit_req和limit_conn的使用说明

注意&#xff1a; 本文内容于 2024-12-07 19:38:40 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;Nginx限流实践。感谢您的关注与支持&#xff01; 一、限流 之前我有记录通过CentOS7定时任务实…

centos9升级OpenSSH

需求 Centos9系统升级OpenSSH和OpenSSL OpenSSH升级为openssh-9.8p1 OpenSSL默认为OpenSSL-3.2.2&#xff08;根据需求进行升级&#xff09; 将源码包编译为rpm包 查看OpenSSH和OpenSSL版本 ssh -V下载源码包并上传到服务器 openssh最新版本下载地址 wget https://cdn.openb…

【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 ✔️ 11.2.2.…

16-02、JVM系列之:内存与垃圾回收篇(二)

JVM系列之&#xff1a;内存与垃圾回收篇(二) ##本篇内容概述&#xff1a; 1、堆Heap Area 2、方法区Method Area 3、运行时数据区总结 4、对象的实例化内存布局和访问定位一、堆 Heap Area 1、堆的核心概念 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心…

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势&#xff0c;帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇&#xff0c;审校为邱雪和许东舟。 一、会议介绍 ICPR…

网络安全知识:网络安全网格架构

在数字化转型的主导下&#xff0c;大多数组织利用多云或混合环境&#xff0c;包括本地基础设施、云服务和应用程序以及第三方实体&#xff0c;以及在网络中运行的用户和设备身份。在这种情况下&#xff0c;保护组织资产免受威胁涉及实现一个统一的框架&#xff0c;该框架根据组…

树莓集团是如何链接政、产、企、校四个板块的?

树莓集团作为数字影像行业的积极探索者与推动者&#xff0c;我们通过多维度、深层次的战略举措&#xff0c;将政、产、企、校四个关键板块紧密链接在一起&#xff0c;实现了资源的高效整合与协同发展&#xff0c;共同为数字影像产业的繁荣贡献力量。 与政府的深度合作政府在产业…

关于睡懒觉

我们经常听到一个词&#xff1a;睡懒觉。 我认为&#xff0c;睡懒觉这个词&#xff0c;是错误的。 人&#xff0c;是需要睡眠的&#xff0c;睡不够&#xff0c;就不会醒。睡够了&#xff0c;自然会醒&#xff0c;也不想继续睡。不信你试试&#xff0c;睡够了&#xff0c;你…

简单的动态带特殊符号敏感词校验

简单的动态带特殊符号敏感词校验 敏感词之前进行了简单了解&#xff0c;使用结巴分词自带词库可以实现&#xff0c;具体参考我的如下博文 敏感词校验 此次在此基础进行了部分优化&#xff0c;优化过程本人简单记录一下&#xff0c;具体优化改造步骤如下所示 1.需求 我们公司…

C++(十二)

前言&#xff1a; 本文将进一步讲解C中&#xff0c;条件判断语句以及它是如何运行的以及内部逻辑。 一&#xff0c;if-else,if-else语句。 在if语句中&#xff0c;只能判断两个条件的变量&#xff0c;若想实现判断两个以上条件的变体&#xff0c;就需要使用if-else,if-else语…

【Redis】Redis基础——Redis的安装及启动

一、初识Redis 1. 认识NoSQL 数据结构&#xff1a;对于SQL来说&#xff0c;表是有结构的&#xff0c;如字段约束、字段存储大小等。 关联性&#xff1a;SQL 的关联性体现在两张表之间可以通过外键&#xff0c;将两张表的数据关联查询出完整的数据。 查询方式&#xff1a; 2.…

Devops 实践

Devops 实践 基本概念jenkins实践安装jenkins仓库环境准备代码环境准备第一次构建持续集成持续部署集成插件 优秀实践心得体会 参考 摘要&#xff1a;本文首先将介绍一些基本概念&#xff0c;包括Devops&#xff0c;CI/CD等&#xff0c;然后基于知名开源CI/CD工具jenkins进行实…

学生信息管理系统(简化版)数据库部分

使用Mysql&#xff0c;与navicat工具 下面是mysql创建的代码&#xff0c;可做必要修改 -- 创建学生学籍信息表 CREATE TABLE StudentEnrollment (-- 学号&#xff0c;作为主键student_id VARCHAR(8) NOT NULL,-- 学生姓名stu_name VARCHAR(8) NOT NULL,-- 学生性别gender VARC…

图生3d 图生全景 学习笔记

目录 instantsplat Aluciddreamer ZoeDepth 会自动下载模型&#xff1a; 图生全景图SD-T2I-360PanoImage&#xff1a; instantsplat Sparse-view SfM-free Gaussian Splatting in Seconds 稀疏视图无SfM高斯喷洒 GitHub - NVlabs/InstantSplat: InstantSplat: Sparse-vi…

PHP:将数据传递给Grid++Report模板进行打印

模板参考 这里使用的模板test111.grt参照进行生成 &#xff0c;需要确保字段对应才能将数据进行传递 GridReport:自定义模板设计&#xff08;自由表格使用&#xff09;&#xff0c;详细教程-CSDN博客https://blog.csdn.net/weixin_46001736/article/details/144315191?spm10…

【C#】新建窗体文件,Form、UserControl

从用途、功能性和架构方面进行描述。 1. 继承自 Form 的窗体&#xff08;通常是窗口&#xff09;&#xff1a; 在 C# 中&#xff0c;Form 是用于创建应用程序的主窗口或对话框窗口的类。当您继承自 Form 时&#xff0c;您创建的是一个完整的窗口&#xff0c;可以显示内容、与…