catch(...)没有捕获所有异常

时间:2014-06-24 08:11:43

标签: c++ exception-handling

我遇到了有关例外的问题。

代码如下所示,

try
{
    auto it = set_difference(allInterfaces.begin(), allInterfaces.end(), eths.begin(),   
    eths.end(), newCards.begin());
}  
catch(...)
{
  cout << "exception thrown << endl;
}

我知道set_difference()抛出一个异常,但是程序退出并且catch块没有捕获异常。有没有办法捕捉异常?我认为这一切都应该永远有效。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

set_difference会将输入集中唯一的元素写入您传入的输出范围。您有责任确保该范围足够大以包含结果。否则,您将超出范围的范围,导致未定义的行为。发生这种情况时不会抛出任何异常,您可以预期的最佳指标是未经优化的构建中的断言失败(并且也无法保证)。

假设newCards是支持push_back的容器,最简单的方法是使用std::back_insert_iterator,每次分配一个对象时都会调用push_back

auto it = set_difference(allInterfaces.begin(), allInterfaces.end(), 
                         eths.begin(), eths.end(), std::back_inserter(newCards));

其他可用选项包括std::front_insert_iterator(来电push_front())和std::insert_iterator(来电insert())。选择最适合您需求的那个。

答案 1 :(得分:1)

在你的评论的帮助下,你很可能增加并迭代从newCards.begin()返回的迭代器,甚至超出了向量的范围。这导致undefined behavior(在您的情况下导致崩溃)而不是抛出C ++异常。迭代器访问没有在C ++中进行边界检查(很少有东西)。

要解决此问题,您还需要传递newCards向量的末尾,并确保不会超出范围。