不捕获向量的异常

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 &lt; 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 &amp;ex)

【讨论】:

以上是关于不捕获向量的异常的主要内容,如果未能解决你的问题,请参考以下文章

访问工作线程的 lambda 中捕获的向量列表中元素的引用时是不是需要互斥锁?

Android Studio 中的异常解析向量资源

使用lambda函数进行向量排序,当不在同一范围内时如何传递变量来捕获组?

20.核心初始化之异常向量表

异常向量表设计

异常中断向量表的地址问题