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

如何在抛出阶段捕获std::out_of_range异常?(vector越界场景)

捕获std::out_of_range异常的正确姿势

嘿,我来帮你搞定这个异常捕获的问题~首先得先给你指出一个关键小细节:你代码里的foo.at[100]写法不对哦!at是std::vector的成员函数,不是数组下标运算符,所以得用圆括号调用:foo.at(100),不然编译器直接就报错了,根本到不了抛出异常那一步😉

正确的try/catch实现步骤

  1. 修正函数调用:把at[]改成at(),这是能触发异常的前提
  2. 高效捕获异常:捕获的时候尽量用const std::out_of_range&引用,避免拷贝异常对象,这是C++异常处理的最佳实践
  3. 可选:获取异常详情:可以通过异常对象的what()方法拿到系统给出的错误描述,帮你更快定位问题

完整示例代码

#include <vector>
#include <cstdio>
#include <stdexcept>

int main() {
    std::vector<int> foo(10);
    try {
        // 注意这里是at()不是at[]!
        foo.at(100) = 42;
    } 
    // 用const引用捕获异常,更高效且避免对象切片
    catch (const std::out_of_range& e) {
        printf("Error at %s line %d\n", __FILE__, __LINE__);
        // 可选:打印异常自带的错误信息,方便排查
        printf("Exception details: %s\n", e.what());
    }

    // 捕获异常后程序可以继续执行,不会直接终止
    printf("Program continues running after catching exception\n");
    return 0;
}

运行效果解释

  • 如果你不捕获异常,程序会触发std::terminate(),就是你看到的那段终止提示
  • 用上面的代码捕获后,程序会先打印你自定义的错误位置,再输出系统提供的异常详情,最后继续执行后续代码,不会直接崩溃

额外小提示

  • 别搞混at()和operator[]:std::vector的operator[]不会做边界检查,访问越界是未定义行为,只有at()才会在越界时抛出std::out_of_range异常
  • 尽量避免用catch(...)捕获所有异常(除非有特殊需求),明确指定异常类型能让你的错误处理更精准

内容的提问来源于stack exchange,提问作者Ken Y-N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:33:38