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++学习一站式分享

相关推荐
白露与泡影几秒前
2025互联网大厂高频Java面试真题解析
java·开发语言·面试
用户31187945592183 分钟前
CentOS 7 安装 net-tools.rpm 包步骤详解(附 rpm 命令和 yum 方法)附安装包
linux
gopyer4 分钟前
180课时吃透Go语言游戏后端开发2:Go语言中的变量
开发语言·游戏·golang·游戏后端开发
我叫黑大帅4 分钟前
什么是 mmap?
linux·c++·操作系统
chuxinweihui5 分钟前
Socket编程UDP
linux·网络·网络协议·udp·通信
月月吃喝6 分钟前
【PyQt5】嵌套多线程数据交互实现
开发语言·qt·交互
匿名45910 分钟前
Lombok注解使用无效的情况(未能获得后端数据)
java·开发语言
玖笙&13 分钟前
✨WPF编程基础【1.2】:XAML中的属性
c++·wpf·visual studio
Ronin30525 分钟前
【Linux网络】Socket编程:UDP网络编程实现Echo Server
linux·网络·udp·网络通信·socket编程
徐子童27 分钟前
JVM高频面试题---GC垃圾回收
java·开发语言·jvm·面试题·gc·垃圾回收算法