c++中try必须紧跟catch,且每个try至少有一个catch;catch需按类型兼容性从具体到宽泛排列,推荐用const t&捕获以避免切片;未捕获异常将调用std::terminate()终止程序。

try 块必须紧跟 catch,不能单独存在
写 try 但不配 catch 是语法错误,编译直接失败。C++ 要求每个 try 至少有一个 catch,哪怕只是兜底用的 catch(...)。常见误写是把 catch 拿去别处、或者用 if 替代 —— 这根本不是异常处理,只是条件判断。
throw 抛出什么,catch 就得按兼容类型接住
抛 std::runtime_error("msg"),就不能只写 catch(std::exception e)(按值捕获会切片),而应写 catch(const std::exception& e);抛 int,catch(long) 不匹配,必须是 catch(int) 或更宽泛的 catch(...)。类型不兼容时,异常不会被捕获,程序调用 std::terminate() 直接退出。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 推荐统一用标准异常类:如
std::runtime_error、std::invalid_argument - 捕获时优先用
const T&,避免拷贝和对象切片 - 多个
catch块必须从具体到宽泛排列,否则宽泛的会提前截断
catch(...) 是最后防线,但拿不到异常信息
catch(...) 能捕获所有未被前面 catch 捕获的异常,但它不提供异常对象,e.what() 这类调用直接报错。它适合做日志记录或资源清理,之后常配合 throw;(空 throw)重新抛出,交由外层处理。
- 不要把它放在第一个
catch,否则其他catch全失效 - 里面不能访问异常值,也不能做类型相关逻辑
- 如果只留
catch(...)又不做throw;,等于静默吞掉异常,调试时极难定位
异常没被任何 catch 捕获时会发生什么
不是返回错误码,也不是跳过,而是立即终止整个程序,调用 std::terminate()。默认行为是打印 terminate called after throwing an instance of '...' 然后 abort。这在服务进程或嵌入式环境里尤其危险——没有栈展开保障、资源可能泄漏、也无机会记录上下文。
- 确保关键路径上有至少一层
catch,比如在main()函数最外层包一个 - RAII 对象(如
std::fstream、std::unique_ptr)会在栈展开时自动析构,这是唯一可靠的事后清理机制 - 不要在构造函数里抛异常后还指望对象“部分建成”,C++ 规定此时对象未完成构造,析构函数不会被调用
catch 的顺序和引用捕获写法。很多崩溃不是因为没加 try,而是 catch 写得看似能用,实则类型不匹配或切片了。C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










