Функция c ++ не улавливает векторный индекс вне диапазона выполнения - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь разбить строку на символ ":", а затем посмотреть, существует ли индекс 2. Моя функция разделения строк работает хорошо, поскольку я использую ее довольно давно, но после попытки попробовать {} catch () this не улавливает выполнение и вместо этого отображает ошибку отладки на моем экране.

    std::vector<std::string> index = split_string(random_stringgg);

    std::cout << index[1] << std::endl;

    try {
        std::string test = index[2];   
    }
    catch (...) {
        std::cout << "error occured" << std::endl;
        return false;
    }
    std::cout << "no error";

Насколько мне известно, это должно попытаться найти 2-й индекс вектора "index", а затем поймать выполнение, если он не может / не может его найти. Однако у меня это не работает, и вместо этого просто выкидывает «векторный индекс вне допустимого диапазона» даже после добавления try / catch. У меня вопрос, почему он не улавливает и все еще отображает ошибку?

Ответы [ 3 ]

2 голосов
/ 06 августа 2020

Если index содержит менее двух элементов, то index[2] вызывает неопределенное поведение, что означает, что компилятор может делать все, что захочет. В частности, не требуется создавать исключение. Если вам нужно исключение, используйте вместо него index.at(2), который указан для этого.

1 голос
/ 06 августа 2020

Если вы хотите, чтобы он генерировал исключение вне допустимого диапазона, вам нужно использовать std::vector::at() вместо std::vector::operator[]. Но вам действительно стоит проверить size() из std::vector.

0 голосов
/ 06 августа 2020

std::vector::operator[] не выполняет проверку границ, поэтому throw исключение не будет, если будет передан недопустимый индекс. Доступ к индексу за пределами с помощью operator[] равен undefined поведение (ОС может вызвать собственное исключение, если недопустимый индекс вызывает доступ к недопустимой памяти, но вы не можете использовать catch для обработки ошибок ОС, если ваш компилятор не реализует не -стандартное расширение для catch, чтобы разрешить это).

Если вы хотите, чтобы генерировалось исключение, std::vector::at() выполняет проверку границ. throw a std::out_of_range исключение, если будет передан недопустимый индекс.

try {
    std::string test = index.at(2);
}
catch (const std::exception &e) {
    std::cout << "error occured: " << e.what() << std::endl;
    return false;
}
...