try / catch缺少向量下标超出范围(调试断言失败)

时间:2018-02-11 03:42:07

标签: c++ debugging vector try-catch

我有一些代码,我正在使用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()

1 个答案:

答案 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