c++中除以零不会抛出异常:整数除零是未定义行为,导致程序崩溃(如sigfpe);浮点除零默认产生inf/nan,不触发try/catch;因信号与c++异常机制分离,需手动判零或用信号/seh处理。

除以零在C++里根本不会抛出异常
直接说结论:int a = 5 / 0; 不会触发 try/catch,程序会崩溃(通常是 SIGFPE 信号),而不是抛出 std::exception 子类。C++ 标准规定整数除零是未定义行为(UB),编译器不保证生成任何异常;浮点除零(如 1.0 / 0.0)默认也不抛 C++ 异常,而是产生 INF 或 NAN,取决于 IEEE 754 模式。
为什么 try catch 捕不到 SIGFPE
try/catch 只捕获用 throw 显式抛出的 C++ 异常,而除零触发的是操作系统信号(Unix/Linux 下是 SIGFPE,Windows 下是结构化异常 SEH),属于底层运行时事件,和异常处理机制不在同一层。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 即使你写了
try { int x = 1/0; } catch(...) { },控制流也不会进入catch - 某些编译器(如 MSVC)在开启特定选项(
/EHsc+/fp:except)时可将浮点异常映射为 C++ 异常,但整数除零依然不支持 - g++/Clang 默认完全不干预除零信号,崩溃就是崩溃
真正可行的检测方式
必须在运算前主动检查,或用信号/SEH 机制拦截,不能依赖 catch。
- 整数除法:永远先判断除数是否为
0——if (b != 0) { result = a / b; } - 浮点除法:可用
std::feclearexcept(FE_DIVBYZERO)+std::fetestexcept(FE_DIVBYZERO)检查是否发生除零(需#include <cfenv></cfenv>,且要启用浮点异常:调用std::feenableexcept(FE_DIVBYZERO),但这不是跨平台的,Linux 上常被忽略 - Unix/Linux:用
signal(SIGFPE, handler)注册信号处理器,但注意信号处理函数中只能调用异步信号安全函数(write可以,std::cout、throw都不行) - Windows:可用
__try/__except(SEH),例如__try { x = 1 / 0; } __except(EXCEPTION_EXECUTE_HANDLER) { /* 处理 */ },但这不是标准 C++,仅限 MSVC
一个容易被忽略的细节
即便你用 std::feenableexcept 启用了浮点除零异常,在 glibc 中它实际依赖内核对 sigaction 的支持,并且会被优化干扰——比如编译器看到 1.0 / 0.0 是常量,可能直接算成 INF 而不触发运行时检查。所以最可靠的方式始终是:手动判零,别指望运行时替你兜底。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










