我有一些代码,我正在使用std::forward_list
我的代码部分测试了 vector 下标是否超出范围,以及 vector 中的元素是否具有某些属性(在这种情况下,不是-1)。
当我只有列表的第一个或第二个节点时,它可以正常工作,并且我可以捕获错误,因为那只是程序的正常部分。但是,在下一个循环中,当我在列表中有3个元素时,我得到了vector subscript out of range
调试断言,并且它未被try/catch
捕获。我必须使用其他技术来解决此错误吗?
这是一个有问题的代码段:
for(int i = 0; i < 8; i++)
{
if(curr->moves[i].at(0) >= 0 && curr->moves[i].at(1) >= 0)
{
next->setPos(curr->moves[i].at(0),curr->moves[i].at(1)); //just sets values of a vector
next->setMoves(); //sets values of a 2d vector
for(int j = 0; j < 8; j++)
{
try{if(board.kBoard[next->moves[i].at(0)][next->moves[i].at(1)] != -1) //the debug assertion is thrown here, but I cannot catch it
next->moves[i].at(2) = 1;}
catch(out_of_range const &err)
{next->moves[i].at(2) = 1;}
}
...
}
}
我已评论发生问题的位置。您(至少在我的屏幕上)必须滚动到右侧才能看到它。我相信,潜在地,我可以使用另一个catch语句,但是由于我已经在使用
out_of_range
,因此我不知道要使用哪个错误,通常可以处理此问题。引发错误时的外观的屏幕快照为this。完全清楚地说,问题发生在try{if(board.kBoard[next->moves[i].at(0)][next->moves[i].at(1) != -1)
,我已在其中评论。我认为它根本没有转到catch
语句,因为它使用的是_DEBUG_ERROR()
最佳答案
从理论上讲,try/catch
语句可以在此处捕获错误,但故意将错误作为算法的一部分来处理是不明智的; try/catch
应该用于在发生错误时进行报告。在这种情况下,我应该使用:
if(next->moves[i].at(0) >= 0 && next->moves[i].at(1) >= 0) //1
if(board.kBoard[next->moves[i].at(0)][next->moves[i].at(1)] != -1) //2
next->moves[i].at(2) = 1; //3
else
next->moves[i].at(2) = 1; //3
这使我可以检查下标是否超出范围(1),检查板的元素是否不为-1(2),以及在这些情况下将
moves[i].at(2)
设置为1(3)。这样可以避免
out_of_range
错误,从而完全不需要try/catch
。
关于c++ - 尝试/捕获丢失的 vector 下标超出范围(调试断言失败),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48728058/