我有一些代码,我正在使用std::forward_list
我的部分代码测试向量下标超出范围,以及向量中的元素是否具有某些属性(在这种情况下,不是-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()
答案 0 :(得分:0)
虽然从理论上讲,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
。