例外没有捕捉向量

时间:2013-11-29 22:21:33

标签: c++ visual-studio-2010 visual-studio try-catch std

我试图在别处找到这个问题,但我遇到的问题对我来说仍然没有意义。我正在使用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捕获的建议。

还有什么能阻止这种情况发生吗?

2 个答案:

答案 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)