我试图在别处找到这个问题,但我遇到的问题对我来说仍然没有意义。我正在使用Visual C ++ 2010,我的程序使用向量超出范围错误。问题是,它从来没有告诉我哪个向量和代码非常大,无法检查每个。我想用try-catch来削减一些东西,但是我无法让它们抓住。以下是我演示的一些示例代码。
try{
std::vector<int> test;
for(int i=0; i<10; i++){
test.push_back(5);
}
if(test[10]=5)
{
}
if(test[-1]=5)
{
}
}
catch(std::exception ex)//also tried exception& and exception*
{
std::cout << "blah";
}
catch(...){
std::cout << "blah";
}
从其他帖子中,我找到了关于通过引用传递,使用...以及声明向量异常总是被std :: exception捕获的建议。
还有什么能阻止这种情况发生吗?
答案 0 :(得分:3)
std::vector::operator[]
不检查数组边界,因此不会抛出C ++异常。因此,在您的情况下,您可以编程behavior is undefined (aka UB)。
您必须使用std::vector::at
来访问带边界检查的元素,如果!(pos < size())
,则会引发std::out_of_range
。
在旁注中,总是通过常量引用捕获异常,如下所示:
try {
// ...
} catch(const exception_type_here& e) {
// ...
}
并且永远不要使用catch-all子句而不重新抛出(就像在你的第二个catch
中)。决不。
希望它有所帮助。祝你好运!
答案 1 :(得分:1)
请参阅docs - std::vector::operator[]
不进行范围检查并且不抛出异常 - 如果传递越界索引,它只会调用未定义的行为。如果您想抛出异常,请改用std::vector::at()
。
捕获类型异常的首选方法是引用:catch (std::exception &ex)
。