如何在向量中捕获.erase异常?

时间:2014-08-10 03:33:33

标签: c++ qt

我在代码中声明了这个向量,我想在以下情况下捕获.erase异常:

当MyVec没有成员且我想删除其中一个索引时,它会抛出错误。我想抓住这个错误。

如果无法捕获此类错误,是否将Qd :: vector更改为Qt中的替代值,如Qlist或...有助于找到解决方案?那么C ++中的其他替代品呢?

void Main()
{
      std::vector <int> MyVec;
      MyVec.clear();

try    
{

    MyVec.erase(MyVec.begin());
}
catch(...)
{
   qDebug("Hoora I've catched the exception !");
}

}
顺便说一下,我在Linux Ubuntu 12.04上工作,而我的IDE是Qt 4.8。

2 个答案:

答案 0 :(得分:3)

根据文件,

  

如果删除的元素包含容器中的最后一个元素,则为no   抛出异常(无抛出保证)。否则,容器   保证以有效状态结束(基本保证)。 无效   位置或范围会导致未定义的行为。

因此std::vector::erase如果没有元素,则不一定会抛出异常。相反,你应该在擦除前检查矢量大小。

if (!vector.empty()) 
{
  // Erase the entire vector.
  vector.erase(vector.begin(), vector.end());
}

答案 1 :(得分:3)

当您尝试擦除无效或过去的迭代器时,

std::vector不会抛出异常。相反,你只是得到了未定义的行为。

如果必须抛出异常,可以这样做:

if (MyVec.empty()) {
    throw std::range_error("MyVec is empty");
    // or maybe std::logic_error or std::runtime_error
}
MyVec.erase(MyVec.begin());

请记住,例外对非常规条件的非本地处理最有用,如果您不需要它们,请尽量避免使用它们。也就是说,如果你能做到

if (MyVec.empty()) {
    // handle this
} else {
    MyVec.erase(MyVec.begin());
}

那么抛出​​异常会更好。