【问题标题】:catch(...) does not catch all exceptionscatch(...) 不会捕获所有异常
【发布时间】:2014-06-24 08:11:42
【问题描述】:

我遇到了一个关于异常的问题。

代码如下,

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

我知道 set_difference() 正在引发异常,但程序退出并且 catch 块没有捕获异常。有没有办法捕捉异常?我认为一切都应该始终有效。

感谢您的帮助。

【问题讨论】:

  • 你认为set_difference 抛出了什么异常?
  • 请记住,有些事情被称为异常,但它们是系统(或处理器)异常,而不是 C++ 异常。 catch 块仅捕获来自 throw 的 C++ 异常,而不是任何其他类型的异常(例如可能导致的空指针访问)。
  • vector newCards 太小导致程序退出。我收到此错误:***检测到 glibc *** /networking: free(): invalid pointer: 0x000000000153d4a8 ***。也许这根本不是一个例外。
  • @Smithy:发布错误消息。
  • @Smithy 也不例外

标签: c++ exception-handling


【解决方案1】:

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())。选择最适合您的需求。

【讨论】:

  • 谢谢,这是一个优雅的解决方案。
【解决方案2】:

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

要解决这个问题,您还需要在 newCards 向量的末尾传递,并确保您不会越界。

【讨论】:

  • 感谢大家的帮助。我需要重新设计代码来阻止这个问题的发生。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2011-05-27
  • 2012-06-04
相关资源
最近更新 更多