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

重载operator[]函数中std::out_of_range异常未被捕获问题咨询

问题原因分析与解决

哦,这个坑我之前也踩过!核心问题出在抛出的异常类型和捕获的类型不匹配,导致catch块完全没触发。

咱们拆解一下你的代码:

  • 你抛出异常时写的是:throw new std::out_of_range("Invalid index!");
    这里的new会在堆上创建一个std::out_of_range对象,实际抛出的是指针类型(std::out_of_range*)。
  • 但你的捕获语句是:catch(std::out_of_range& ex)
    这里要捕获的是引用类型(std::out_of_range&),和抛出的指针类型完全不匹配,所以程序根本不会进入这个catch块,异常就直接变成未处理的了。

两种修正方案

方案1:推荐做法——抛出值类型(C++标准实践)

把抛出语句里的new去掉,直接抛出值类型,这样catch引用就能正常捕获:

try {
    if (index < 0 || index >= n) 
        throw std::out_of_range("Invalid index!"); // 去掉new,抛出值类型
    return arr[index]; 
} catch(std::out_of_range& ex) { 
    cout << ex.what() << endl;
    // 注意:这里抛出异常后如果继续return arr[index]会有问题,因为index是非法的,建议要么重新抛出,要么返回一个安全值
}

C++里推荐抛出值,捕获引用,这样既避免了对象拷贝的开销,又不用手动管理内存,是最常用的异常处理方式。

方案2:捕获指针类型(不推荐)

如果你非要用new抛出指针(不建议,因为需要手动释放内存,容易泄漏),那就要把catch块改成捕获指针:

try {
    if (index < 0 || index >= n) 
        throw new std::out_of_range("Invalid index!");
    return arr[index]; 
} catch(std::out_of_range* ex) { 
    cout << ex->what() << endl;
    delete ex; // 必须手动释放,否则内存泄漏
}

另外补充一句:你提到通常不在同一函数捕获异常,这个习惯是对的——异常处理的核心是让上层调用者决定如何处理错误,同一函数内捕获一般只用于特殊的测试或清理场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:21:01