我在代码中声明了这个向量,我想在以下情况下捕获.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。
答案 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());
}
那么抛出异常会更好。