C++ 如何捕获。删除向量中的异常?

C++ 如何捕获。删除向量中的异常?,c++,qt,C++,Qt,我已在代码中声明了此向量,并希望捕获。在以下情况下擦除异常: 当MyVec没有成员并且我想删除它的一个索引时,它将抛出一个错误。我想捕捉这个错误 如果无法捕获这种错误,那么将std::vector更改为Qt中的其他错误(如Qlist或。。。帮助找到解决方案?C++中的其他备选方案? void Main() { std::vector <int> MyVec; MyVec.clear(); try { MyVec.erase(MyVec.be

我已在代码中声明了此向量,并希望捕获。在以下情况下擦除异常:

当MyVec没有成员并且我想删除它的一个索引时,它将抛出一个错误。我想捕捉这个错误

如果无法捕获这种错误,那么将std::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 !");
}

}
void Main()
{
std::载体MyVec;
MyVec.clear();
尝试
{
MyVec.erase(MyVec.begin());
}
捕获(…)
{
qDebug(“万岁,我抓住了例外!”);
}
}
顺便说一下,我在Linux Ubuntu 12.04上工作,我的IDE是Qt 4.8。

根据文档

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

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

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

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

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

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

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());
}

那么,最好是抛出一个异常。

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());
}

那么,抛出异常就更好了。

好的,如果我在多线程程序中使用此代码,会发生什么?假设我使用互斥概念来确保每次使用都是正确的,那么这个错误会再次发生吗?这可以处理作业吗?@PsP是的,如果多个线程可以访问向量,我建议锁定,以防止一个线程在另一个线程修改向量时访问向量,或者在检查向量是否为空后,但在执行擦除操作之前清空向量。@PsP还有其他方法可以防止不安全的并发访问。我不知道;我对并发性几乎没有经验。@PsP如果您有不同的问题,请单独提问,或者修改您的问题以包括您打算做什么的细节。到目前为止,我认为你正在走一条危险的道路,只让我们知道注定要失败的更大设计的零碎部分。你会得到一些正确的细节,但设计仍然会崩溃,因为你需要得到所有的正确,而不仅仅是一些。@KubaOber抱歉,我想问另一个问题,这将更好地解释实际情况。谢谢,如果我在多线程程序中使用这段代码会发生什么?假设我使用互斥概念来确保每次使用都是正确的,那么这个错误会再次发生吗?这可以处理作业吗?@PsP是的,如果多个线程可以访问向量,我建议锁定,以防止一个线程在另一个线程修改向量时访问向量,或者在检查向量是否为空后,但在执行擦除操作之前清空向量。@PsP还有其他方法可以防止不安全的并发访问。我不知道;我对并发性几乎没有经验。@PsP如果您有不同的问题,请单独提问,或者修改您的问题以包括您打算做什么的细节。到目前为止,我认为你正在走一条危险的道路,只让我们知道注定要失败的更大设计的零碎部分。你会得到一些正确的细节,但设计仍然会崩溃,因为你需要得到所有的正确,而不仅仅是一些。@KubaOber抱歉,我想问另一个问题,这将更好地解释实际情况。谢谢