You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows终端中C++除零错误未被捕获的问题求助

整数除零未触发std::exception捕获的原因及解决方法

问题根源

C标准明确规定,整数除法除以零属于未定义行为,编译器不会自动抛出std::exception类型的异常。你代码里的catch块只捕获const std::exception&类型,自然抓不到这个运行时错误。不同编译器对这种情况的处理不同,你使用的MinGW(GCC 12.2.0)会直接终止程序,不会触发C标准异常体系的抛出逻辑。

解决办法

要捕获整数除零的情况,必须手动检查除数,主动抛出异常。修改后的代码如下:

#include <iostream>
#include <exception>

int main(){
    int res{ 120 }, div{1};

    std::cin >> div;

    try {
        if (div == 0) {
            throw std::runtime_error("整数除零错误");
        }
        std::cout << res / div << std::endl;
    } catch (const std::exception& err) {
        std::cout << err.what() << std::endl;
    }
    
    std::cout << "Ended" << std::endl;
        
    return 0;
}

核心要点

  • 在执行除法操作前,先判断除数是否为0,一旦检测到就抛出std::runtime_error(它是std::exception的子类),这样就能被你的catch块正常捕获并输出错误信息。
  • 如果想处理平台相关的硬件异常(比如Windows的结构化异常),MinGW可以用-mseh编译选项配合特定处理,但这种方式不跨平台,优先推荐手动检查的方案,更符合C++标准规范。

额外提示

  • 浮点数除法除以零是有定义的:会得到无穷大或NaN值,不会抛出异常,但可以用std::isfinite函数检查结果是否合法。
  • 你的编译命令g++ -std=c++20 -Wall -Wextra -Werror main.cpp -o result没有问题,但整数除零是运行时问题,编译阶段无法通过警告或错误检测出来。

内容的提问来源于stack exchange,提问作者gargaranza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:01:10