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

C++程序中异常已抛出但未被捕获的问题排查

为什么你的Denominator_Is_Zero异常没被捕获?

别慌,这种抛出异常后直接崩溃的情况,大概率是你在异常处理的几个关键环节踩了坑,我给你梳理几个最常见的原因:

  • 异常类型匹配出错
    你抛出的是自定义的Denominator_Is_Zero异常,但捕获时可能写错了类型——比如把下划线漏掉写成DenominatorIsZero,或者你的自定义异常没继承std::exception,却试图用catch(const std::exception&)来捕获?记住,捕获异常必须严格匹配类型(除非用基类捕获派生类异常),而且建议用const Denominator_Is_Zero&来捕获,既能避免拷贝开销,也能兼容可能的派生异常。

  • 抛出代码不在try块范围内
    你是不是在没有被try{...}包裹的代码里抛出了异常?比如调用抛出异常的函数时,外层没有try块兜底,那自然找不到对应的catch块,程序会直接触发std::terminate()崩溃。举个错误示例:

    void divide(int num, int den) {
        if (den == 0) throw Denominator_Is_Zero();
    }
    
    int main() {
        divide(10, 0); // 这里没有try包裹,抛出后直接崩溃
        return 0;
    }
    

    正确的做法是把可能抛出异常的代码放进try块:

    int main() {
        try {
            divide(10, 0);
        } catch (const Denominator_Is_Zero&) {
            std::cout << "错误:分母不能为0!" << std::endl;
        }
        return 0;
    }
    
  • 自定义异常的定义有问题
    你有没有正确定义Denominator_Is_Zero这个异常类型?比如只声明了类但没给出定义,或者构造函数有问题导致无法正常实例化?比如:

    // 错误示例:仅声明未定义
    class Denominator_Is_Zero; 
    
    void func() {
        throw Denominator_Is_Zero(); // 这里会因为类未定义触发问题
    }
    

    至少要给出完整的类定义,推荐继承std::exception,这样不仅能自定义错误信息,还能兼容基类捕获:

    class Denominator_Is_Zero : public std::exception {
    public:
        const char* what() const noexcept override {
            return "分母不能为0";
        }
    };
    
  • 编译器禁用了异常机制
    有些编译器默认可能关闭了异常支持,或者你编译时加了-fno-exceptions(GCC/Clang)之类的参数,导致异常机制根本没生效。这种情况下,抛出异常会直接终止程序。你可以检查编译命令,确保没有禁用异常的选项——GCC/Clang默认开启异常,MSVC在Debug模式下默认开启,Release模式下可以手动确认。

先排查这几个点,应该能快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:49:14