C++如何处理异常 _ try-catch捕获与throw用法【实战】
C++异常处理中,try-catch块仅能捕获由throw抛出的异常,系统级错误(如空指针、除零等)无法触发catch语句。catch语句参数推荐使用引用类型以避免拷贝异常对象。RAII机制是保证异常安全的唯一可靠路径,被noexcept修饰的函数抛出异常会直接调用terminate函数。
先抛出一个结论:能用 try-catch 捕获的,只有真正被 throw 抛出的 C++ 异常。 像空指针解引用、除零这类系统级错误,默认是不会触发 catch 的,除非编译器开启特定异常机制(比如 Windows 的 SEH 转换)。
看这张图,直观展示了 C++ 异常处理的边界:
什么时候 catch 会完全失效?
很多人以为 catch(...) 能抓一切,真相远没那么简单。它只捕获 C++ 异常对象,对下面这些情况完全无感:
- 访问野指针或
nullptr导致的段错误(SIGSEGV),在 Linux/macOS 下直接进程终止,catch 根本来不及反应 int x = 1 / 0;—— 这是 CPU 级别的 trap,C++ 标准压根不把它定义为异常- 栈溢出、内存耗尽(
new失败时,只有开了nothrow才会抛std::bad_alloc)
验证方法很简单:写个 throw 42; 能被捕获;但 *(int*)0 = 1; 会直接 crash,catch(...) 连运行的机会都没有。
throw 表达式必须匹配 catch 类型吗?
必须匹配,但规则比表面严格。不是“能转就行”,而是要求类型相同、公有继承、或有可调用的拷贝/移动构造函数:
throw std::runtime_error("msg");→ 可被catch(std::exception& e)捕获(公有继承)throw "hello";→ 只能被catch(const char*)捕获,catch(std::string)不行(隐式转换不参与匹配)throw 3.14;→catch(int)捕不到,catch(double)才行
核心建议:始终抛 std::exception 派生类,避免基础类型传递导致的切片或生命周期问题。
为什么 catch 参数推荐用引用?
值传递会触发异常对象拷贝,可能抛新异常(比如拷贝构造函数里 new 失败),导致栈展开中断、程序终止。看这个例子:
class BadCopy {public: BadCopy() = default; BadCopy(const BadCopy&) { throw std::runtime_error("copy failed"); }};// ...try { throw BadCopy{};} catch(BadCopy b) { /* 这里会二次崩溃 */ }正确写法只有一种:
catch(const std::exception& e)—— 安全、高效、支持多态- 避免
catch(std::exception e)(值传递)和catch(std::exception&& e)(仅匹配右值,漏掉大部分情况)
资源泄漏风险:throw 发生在构造函数里怎么办?
构造函数中途 throw,已构造的成员会自动析构,但裸指针、文件描述符等不会。看个错例:
- 错例:
FILE* fp = fopen("x.txt", "r"); if (!fp) throw std::runtime_error("open fail");——fopen成功后若后续 throw,fp泄漏 - 正解:用 RAII 封装,比如
std::unique_ptr或std::ifstream - 更彻底的做法:把资源获取逻辑移到工厂函数中,构造函数只做轻量初始化
记住:C++ 异常安全的唯一可靠路径是 RAII,不是靠 try-catch 到处兜底。
话题回到最容易忽略的一点:noexcept 函数里如果意外抛出异常,程序会立刻调用 std::terminate,连 catch(...) 都来不及触发。检查第三方库接口是否标记 noexcept,比写 try 更关键。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













