如何在抛出阶段捕获std::out_of_range异常?(vector越界场景)
捕获std::out_of_range异常的正确姿势
嘿,我来帮你搞定这个异常捕获的问题~首先得先给你指出一个关键小细节:你代码里的foo.at[100]写法不对哦!at是std::vector的成员函数,不是数组下标运算符,所以得用圆括号调用:foo.at(100),不然编译器直接就报错了,根本到不了抛出异常那一步😉
正确的try/catch实现步骤
- 修正函数调用:把
at[]改成at(),这是能触发异常的前提 - 高效捕获异常:捕获的时候尽量用
const std::out_of_range&引用,避免拷贝异常对象,这是C++异常处理的最佳实践 - 可选:获取异常详情:可以通过异常对象的
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
相关产品推荐
相关产品推荐

