不捕获向量的异常
Posted
技术标签:
【中文标题】不捕获向量的异常【英文标题】:Exceptions not catching for vectors 【发布时间】:2013-11-29 22:21:32 【问题描述】:我试图在其他地方找到这个问题,但我遇到的问题对我来说仍然没有意义。我正在使用 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 捕获的说法。
那么还有什么可以防止这种情况发生吗?
【问题讨论】:
感谢您的帮助。我选择了第二个,因为他们也提到了错误的名称。 【参考方案1】: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
中一样)。绝不。
希望对您有所帮助。祝你好运!
【讨论】:
【参考方案2】:请参阅docs - std::vector::operator[]
不进行范围检查并且不抛出异常 - 如果您传递越界索引,它只会调用未定义的行为。如果您想抛出异常,请改用std::vector::at()
。
捕获类型异常的首选方法是通过引用:catch (std::exception &ex)
。
【讨论】:
以上是关于不捕获向量的异常的主要内容,如果未能解决你的问题,请参考以下文章
访问工作线程的 lambda 中捕获的向量列表中元素的引用时是不是需要互斥锁?