try/catch/throw 简明指南

⚡ 为什么需要异常处理?

当函数遇到无法处理的错误时(如除零、文件不存在),传统返回错误码的方式需要逐层检查,导致代码耦合。异常处理允许错误直接"跳转"到处理模块:

cpp 复制代码
double safeDivide(double a, double b) {
    if (b == 0) throw std::runtime_error("除数不能为0"); // 抛出
    return a / b;
}

🔍 核心三件套使用
1. throw - 抛出异常
  • 可抛出任意类型(但推荐标准异常类
cpp 复制代码
throw 42;                        // 基本类型(不推荐)
throw std::out_of_range("索引越界"); // 标准异常类✅
2. try/catch - 捕获并处理
  • catch按顺序匹配类型,支持常量引用捕获
cpp 复制代码
try {
    safeDivide(10, 0);
}
catch (const std::runtime_error& e) { // 引用捕获避免拷贝
    std::cout << "数学错误: " << e.what() << std::endl;
}
catch (...) { // 兜底捕获所有异常
    std::cout << "未知错误" << std::endl;
}

🚫 常见陷阱规避
  1. 避免捕获基类在前
cpp 复制代码
catch (const std::exception& e) { /*...*/ }  // 捕获所有派生类
catch (const std::runtime_error& e) { ... } // ❌ 永远不会被执行!
  1. 不要忽略异常
    catch块会导致静默失败:
cpp 复制代码
try { /* 可能出错的操作 */ }
catch (...) {} // ❌ 危险!隐藏了错误

推荐:C++学习一站式分享

相关推荐
栈与堆2 分钟前
LeetCode-88-合并两个有序数组
java·开发语言·数据结构·python·算法·leetcode·rust
A-花开堪折2 分钟前
Qemu-NUC980(十一):SPI Controller
linux·arm开发·驱动开发·嵌入式硬件
彩妙不是菜喵3 分钟前
C++:类与对象
开发语言·c++
董世昌415 分钟前
添加、删除、替换、插入元素的全方法指南
java·开发语言·前端
RisunJan5 分钟前
Linux命令-ipcrm命令(删除Linux系统中的进程间通信(IPC)资源)
linux·运维·服务器
Joren的学习记录6 分钟前
【Linux运维大神系列】Kubernetes详解2(kubeadm部署k8s1.27单节点集群)
linux·运维·kubernetes
Yu_Lijing6 分钟前
基于C++的《Head First设计模式》笔记——抽象工厂模式
c++·笔记·设计模式
源代码•宸9 分钟前
Leetcode—712. 两个字符串的最小ASCII删除和【中等】
开发语言·后端·算法·leetcode·职场和发展·golang·dp
lbb 小魔仙11 分钟前
【Linux】K8s 集群搭建避坑指南:基于 Linux 内核参数调优的生产级部署方案
linux·运维·kubernetes
无风听海11 分钟前
C# 中对象相等性判断的全面解析
开发语言·c#