当前位置: 首页 > news >正文

十五、C++速通秘籍—异常处理

目录

上一章节:

一、引言

断言:

断言的用途:

二、什么是异常处理

三、异常处理的“三大法宝”

四、异常处理的“用武之地”

1、文件操作中的“守护神”

2、内存分配中的“救星”

五、异常处理的“终极使命”

六、总结


上一章节:

十四、C++速通秘籍—函数式编程-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147191769?spm=1001.2014.3001.5502

一、引言

在C++的编程江湖里,代码就像我们手中的宝剑,在披荆斩棘的过程中,难免会遇到各种“妖魔鬼怪”,也就是程序运行时的错误。异常处理就如同一位法力高强的护法,能帮我们轻松应对这些突发状况,让程序平稳运行。接下来,就让我们一起揭开异常处理的神秘面纱吧!

开启这段介绍之前插入一个话题,对于我们调试过程中经常使用到的“断言”,这个并不是异常处理方式:

断言:

它是一种调试工具,用于在代码里检查某个条件是否为真。若条件为假,程序会终止并给出错误信息。在 C++ 中,可使用  头文件里的 assert 宏来实现断言。

断言的用途:

主要用于在开发和调试阶段找出程序中的逻辑错误。例如,你可能会在函数开头断言输入参数是否合法。

#include <cassert>
#include <iostream>

// 一个简单的除法函数,使用断言检查除数是否为零
double divide(double a, double b) {
    assert(b != 0 && "除数不能为零");
    return a / b;
}

int main() {
    double result = divide(10, 0);
    std::cout << "结果: " << result << std::endl;
    return 0;
}

若想断言在编译期发现,则可以使用static_assert,如果表达式为假,编译器会产生一个编译错误,并输出指定的错误信息。

#include <iostream>

template<typename T>
void checkType() {
    static_assert(sizeof(T) >= 4, "类型的大小必须至少为 4 字节");
    std::cout << "类型检查通过" << std::endl;
}

int main() {
    checkType<char>();
    return 0;
}

static_assert是编译时检查,与是否是发布版本无关。在上述代码中,由于char类型的大小通常为 1 字节,不满足sizeof(T) >= 4的条件,编译器会报错,阻止程序编译通过。推荐使用!!

在发布版本中,断言通常会被禁用,以避免影响程序的性能。

二、什么是异常处理

简单来说,异常处理是一种机制,当程序运行中碰到错误或异常状况时,它能让程序暂停当前的执行流程,然后跳转到专门处理异常的代码区域。从而避免软件的直接崩溃,给软件使用者提供了很好的体验保护。这就好比我们在探险时,遇到了陷阱,马上启动应急方案,避免陷入绝境。

三、异常处理的“三大法宝”

在C++中,异常处理主要依靠 try、catch 和 throw 这三个关键字。它们就像一个紧密配合的团队,各司其职。

try {
    // 这里是可能会触发异常的代码,就像探险中的危险区域
    throw exception_type; // 当危险来临,抛出异常信号
} catch (exception_type e) {
    // 捕获异常,进行相应的处理,如同启动应急方案
}

下面,我们通过一个具体的例子来看看这“三大法宝”是如何发挥作用的。

#include <iostream>
#include <stdexcept>

int main() {
    try {
        int numerator = 10;
        int denominator = 0;
        if (denominator == 0) {
            throw std::runtime_error("除数可不能为零呀,这会出大问题!");
        }
        int result = numerator / denominator;
        std::cout << "计算结果是: " << result << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "哎呀,捕获到异常啦: " << e.what() << std::endl;
    }
    return 0;
}

在这个例子里,我们在 try 块中进行除法运算。要是除数为零,就用 throw 关键字抛出一个 std::runtime_error 异常,这时,程序就会立刻跳转到 catch 块,输出异常信息。这样,即便遇到除零这种危险情况,程序也不会崩溃,而是能妥善处理异常。

四、异常处理的“用武之地”

1、文件操作中的“守护神”

在进行文件操作时,就像我们去打开一个神秘的宝箱,可能会遇到宝箱打不开(文件不存在)或者钥匙不对(文件打开失败)等情况。异常处理就能帮我们应对这些问题。

#include <iostream>
#include <fstream>
#include <stdexcept>

void readFile(const std::string& filename) {
    std::ifstream file(filename);
    if (!file.is_open()) {
        throw std::runtime_error("文件打不开呀,是不是路径搞错啦!");
    }
    std::string line;
    while (std::getline(file, line)) {
        std::cout << line << std::endl;
    }
    file.close();
}

int main() {
    try {
        readFile("nonexistent_file.txt");
    } catch (const std::exception& e) {
        std::cerr << "捕获到异常: " << e.what() << std::endl;
    }
    return 0;
}

在这个例子中,我们定义了一个 readFile 函数来读取文件内容。要是文件打开失败,就抛出一个 std::runtime_error 异常。在 main 函数里,我们用 try-catch 块来捕获并处理这个异常。

2、内存分配中的“救星”

在进行动态内存分配时,就像我们去申请一块土地,可能会遇到土地不够用(内存不足)的情况。异常处理就能帮我们处理这种尴尬局面。

#include <iostream>
#include <new>

int main() {
    try {
        while (true) {
            int* ptr = new int[1000000];
        }
    } catch (const std::bad_alloc& e) {
        std::cerr << "捕获到异常: " << e.what() << std::endl;
    }
    return 0;
}

在这个例子中,我们用 new 运算符不断地申请内存。当内存不够时,就会抛出一个 std::bad_alloc 异常。我们用 try-catch 块来捕获并处理这个异常。

五、异常处理的“终极使命”

异常处理的主要目的就是让我们的程序更加健壮和可靠。它就像一个优秀的后勤保障团队,把错误处理代码和正常的业务逻辑代码分开,让代码更加清晰易懂,也更容易维护。同时,它能让程序在遇到错误时不会直接崩溃,而是能优雅地处理错误,给用户带来更好的体验。

六、总结

异常处理在C++的编程世界里占据着不可或缺的地位。掌握了异常处理的基本语法和使用场景,就好比在编程江湖中拥有了一件绝世神兵,能让你的C++程序更加稳定、强大。希望这篇博客能助你快速掌握异常处理这个秘籍,在编程的道路上一路披荆斩棘!

相关文章:

  • 基于Python的经济循环模型构建与可视化案例
  • Matlab添加标题title与标签lable
  • 上层 Makefile 控制下层 Makefile 的方法
  • 解释型语言和编译型语言的区别
  • 安全岗の夺命连环问:(第壹篇)从XSS到0day的灵魂拷问
  • 舵机、震动传感器、超声波使用代码
  • Qt 5.14.2 入门(四)菜单栏和工具栏的创建
  • 六、继承(三)
  • 如何用finallshell连接虚拟机
  • 前端下载文件时浏览器右上角没有保存弹窗及显示进度,下载完之后才会显示保存弹窗的问题定位及解决方案
  • PHP 拆词搜索(常用于搜索内容)
  • 从三次方程到复平面:复数概念的奇妙演进(一)
  • 多光谱相机:海洋管道漏油(溢油)监测
  • 2025蓝桥杯C++ A组省赛 题解
  • 用Python构建区块链身份认证:安全与信任的新篇章
  • ZYNQ笔记(七):程序固化(QSPI Flash)
  • OpenSSH版本的重大升级 :OpenSSH 10
  • 推流265视频,网页如何支持显示265的webrtc
  • [特殊字符] Hyperlane:为现代Web服务打造的高性能Rust文件上传解决方案
  • 天梯赛L2题目算法汇总(记录高频考点)
  • 夜读丨喜马拉雅山的背夫
  • 19个剧团15台演出,上海民营院团尝试文旅融合新探索
  • “浦东时刻”在京展出:沉浸式体验海派风情
  • 本周看啥|喜欢二次元的观众,去电影院吧
  • 国家发改委:美芯片药品等领域关税影响全球科技发展,损害人类共同利益
  • 眉山“笑气”迷局:草莓熊瓶背后的隐秘与危机