在什么情况下,这个if语句会抛出异常?

时间:2013-08-23 16:39:26

标签: c++ if-statement stdstring outofrangeexception

显然,当我的代码到达此if语句时,会发生string subscript out of range异常。

// a is int
// str is std::string

while ( true )
{    
// other stuff
if( a == str.size() ) // this line throws an exception
    break;
}

在什么情况下这样简单的if语句会抛出异常?我只是没有看到它。如果由于某种原因比较失败,它不应该只返回0吗?

编辑: 这是它发生的全部功能。它基本上读取文件并接受其中某些标记的值。 如果它具有一定的相关性,我使用 Visual Studio 2010 Express 并且错误显示“Debug Assertion Failed”。

void Function(string &str, int start)
{
    int outline;

    // Read all attributes
    int pos, pos2 = start;
    while( true )
    {       
        pos = SkipWhiteSpace(str, pos2);
        pos2 = FindEndOfToken(str, pos);

        string token = str.substr(pos, pos2-pos);

        pos = SkipWhiteSpace(str, pos2);
        if( pos == str.size() || str[pos] != '=' ) break;

        pos = SkipWhiteSpace(str, pos+1);
        pos2 = FindEndOfToken(str, pos);
        file<<"...part 3";

        string value = str.substr(pos, pos2-pos);

        if( token == "outline" )
            outline = (short)strtol(value.c_str(), 0, 10);

        if( pos == str.size() ) // <--- error here (at least, it seems so)
            break;      
    }

    SetOutline(outline);
}

SkipWhiteSpace()FindEndOfToken()函数就是这两个函数。

int SkipWhiteSpace(string &str, int start)
{
    UINT n = start;
    while( n < str.size() )
    {
        char ch = str[n];
        if( ch != ' ' && 
            ch != '\t' && 
            ch != '\r' && 
            ch != '\n' )
            break;

        ++n;
    }

    return n;
}

int FindEndOfToken(string &str, int start)
{
    UINT n = start;
    if( str[n] == '"' )
    {
        n++;
        while( n < str.size() )
        {
            char ch = str[n];
            if( ch == '"' )
            {
                // Include the last quote char in the token
                ++n;
                break;
            }
            ++n;
        }
    }
    else
    {
        while( n < str.size() )
        {
            char ch = str[n];
            if( ch == ' ' ||
                ch == '\t' ||
                ch == '\r' ||
                ch == '\n' ||
                ch == '=' )
                break;

            ++n;
        }
    }

    return n;
}

1 个答案:

答案 0 :(得分:0)

此行永远不会抛出异常。你确定你得到的是真正的C ++异常而不是崩溃吗?