跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 异常处理机制详解

介绍 C++ 异常处理机制,涵盖 try、throw、catch 核心语法及标准异常类使用。通过除法运算和数组越界示例展示如何优雅捕获运行时错误,对比传统错误码方式,阐述异常处理在逻辑分离、跨函数传递及强制处理方面的优势。同时提供新手注意事项,强调避免滥用异常及规范使用标准类的重要性。

竹影清风发布于 2026/3/30更新于 2026/5/2335 浏览

一、异常处理概述

简单说,异常处理是 C++ 中专门用来捕获程序运行时意外错误的机制。例如程序打开不存在的文件、数组下标越界、内存分配失败等突发情况,若不处理会导致崩溃;使用异常处理可以优雅地接住错误,让程序继续运行或友好退出。

类比:点外卖(程序执行)正常收到餐(代码跑通),但可能遇到商家没货或骑手超时(异常)。异常处理让你不用干等崩溃,而是选择换店或取消订单(处理异常)。

二、核心语法

C++ 异常处理有三个核心关键字:try、throw、catch,配合使用。

#include <iostream>
#include <stdexcept>
using namespace std;

// 一个可能抛出异常的函数:计算除法
double divide(double a, double b) {
    // 检测异常条件:除数为 0
    if (b == 0) {
        // 抛出异常:throw 后面是异常对象
        throw invalid_argument("除数不能为 0!");
    }
    return a / b;
}

int main() {
    double num1 = 10, num2 = 0;

    // 1. try 块:包裹可能抛出异常的代码
    try {
        double result = divide(num1, num2);
        cout << "计算结果:" << result << endl;
    }
    // 2. catch 块:捕获并处理对应类型的异常
    catch (const invalid_argument& e) {
        // 匹配 throw 抛出的异常类型
        cout << "捕获到异常:" << e.what() << endl;
    }
    // 3. 万能 catch:捕获所有类型的异常(可选)
    catch (...) {
        cout << "捕获到未知异常!" << endl;
    }

    // 异常处理后,程序继续执行
    cout << "程序未崩溃,正常结束~" << endl;
    return 0;
}

关键语法解释

  1. try 块:必须有,里面放'可能出问题'的代码。
  2. throw 抛出异常:检测到错误时主动扔出异常,程序立即跳转到对应的 catch 块。
  3. catch 捕获异常:
    • 紧跟 try 块,类型必须和 throw 抛出的类型匹配;
    • ... 是万能捕获,建议放在最后;
    • e.what() 获取异常描述字符串。

三、常用标准异常类

C++ 标准库提供了一系列现成的异常类,推荐使用。

异常类用途示例场景
invalid_argument无效参数除数为 0、传入非法字符
out_of_range越界访问数组/字符串下标越界
bad_alloc内存分配失败new 关键字申请内存失败
runtime_error运行时错误文件打开失败

示例:用 out_of_range 处理数组越界

#include <iostream>
#include <stdexcept>
#include <vector>
using namespace std;

int getElement(vector<int>& vec, int index) {
    if (index < 0 || index >= vec.size()) {
        throw out_of_range("数组下标越界!");
    }
    return vec[index];
}

int main() {
    vector<int> nums = {1, 2, 3};
    try {
        cout << getElement(nums, 5) << endl;
    } catch (const out_of_range& e) {
        cout << "异常:" << e.what() << endl;
    }
    return 0;
}

四、异常处理的优势

对比传统的'返回错误码',异常处理的优势:

  1. 错误和业务逻辑分离:无需在代码里到处写判断,错误处理集中在 catch 块。
  2. 能跨函数传递:异常可穿过多层函数调用,直接被上层 catch 捕获。
  3. 强制处理错误:若抛出异常未被 catch,程序会调用 terminate() 崩溃,避免隐性错误。

五、注意事项

  1. 不要用异常处理替代正常的逻辑判断(如循环结束条件),只处理意外情况。
  2. 抛出异常时尽量用标准异常类,而非 int/string,可读性更好。
  3. catch 块按'具体异常在前,万能异常在后'的顺序写。
  4. 异常处理有轻微性能开销,但对普通程序几乎无影响。

总结

  1. C++ 异常处理核心是 try + throw + catch,能避免程序崩溃,优雅处理运行时错误。
  2. 优先使用标准异常类,让代码更规范。
  3. 异常处理适合处理意外错误,核心优势是错误与业务代码分离。

目录

  1. 一、异常处理概述
  2. 二、核心语法
  3. 关键语法解释
  4. 三、常用标准异常类
  5. 示例:用 outofrange 处理数组越界
  6. 四、异常处理的优势
  7. 五、注意事项
  8. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Linux 权限管理与文件属性详解
  • ZeroClaw Gateway + LM Studio + Reflex 本地 AI 管理面板搭建
  • Nginx 部署前端 Vue 项目实战指南
  • AMD 显卡加速 Whisper 语音识别:从环境配置到性能优化实战
  • Flutter 三方库 bavard 的鸿蒙化适配指南:语义化聊天协议与机器人逻辑
  • Python 学习路线:从入门到精通的完整指南
  • DankDroneDownloader:大疆无人机固件下载工具
  • Web 自动化测试实战:以博客系统为例,从用例到报告全流程解析
  • PyCharm 报错:JetBrains AI URL resolution failure
  • C++ 二维前缀和算法模板与解析
  • MoonTV:基于 Next.js 的开源跨平台影视聚合播放器
  • 链表节点两两交换:Java 递归与迭代实战
  • 鸿蒙系统若不再兼容安卓,对行业生态有何影响?
  • 算法实战:Z 字形变换与外观数列解析
  • Visual C++ Redistributable 运行时组件问题修复指南
  • OpenClaw 本地部署飞书机器人实战
  • DeepSeek 使用指南与高阶提示词技巧
  • Windows 系统安装与配置 Neo4j 图数据库指南
  • Stable Diffusion WebUI 集成 Lingyuxiu MXJ LoRA 插件方案
  • ComfyUI 按需付费部署与成本优化方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online