C/C++

Не работает функция catch() | C++

Есть следующий код:

#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

using std::cin; using std::cout; using std::endl; using std::vector;

int main()
{
vector<int> input;

try
{
int i;
while (cin >> i) input.push_back(i);
for (int i = 0; i <= input.size(); ++i)
{
cout << "v [" << i << "] - " << input[i] << "\n";
}
cout << endl;
}

catch (std::out_of_range) {
cout << "Index out of range!\n";
return 1;
}

return 0;
}

В цикле for() нарочно допущена ошибка в диапазоне вывода элементов массива.
Вот только проблема в том, что она не перехватывается catch'ем.

Её "ловит" компиллятор Visual Studio, но при его отключении сама функция catch() не подаёт признаков жизни.

ШТО ДЕЛОТЬ????

Заранее спасибо!
попробуйте использовать at(i) вместо [i] чтобы вектор мог генерировать исключения
operator[] не должен проверять выход за границы
Sergey Sh
Sergey Sh
25 445
Лучший ответ
Олег Шаймиев Тащите сюда руку! Я должен её пожать!

Завтра поставлю за Ваше имя десять свечек в церкви.
Семнадцать часов жизни заняла простейшая прога... боже ты мой...

Без шуток - ОГРОМНОЕ спасибо!
Попробуйте так:
catch (std::out_of_range e)
Олег Шаймиев Попробовал. Результат тот же.
Равно как и с catch (std::out_of_range& e)
оператор [] осуществляет доступ без проверки на диапазон, поэтому не выбрасывает исключений.
UPD:: а правильный ответ от Айрана не заметил)
Radu Matveev
Radu Matveev
51 416
Проблема заключается в том, что выход за границы вектора не является исключением типа std::out_of_range. Вместо этого, это приводит к неопределенному поведению программы.

Чтобы перехватить эту ошибку, вы можете использовать стандартное исключение std::exception. Вот как это можно сделать:

#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>

using std::cin; using std::cout; using std::endl; using std::vector;

int main()
{
vector<int> input;

try
{
int i;
while (cin >> i) input.push_back(i);
for (int i = 0; i <= input.size(); ++i)
{
cout << "v [" << i << "] - " << input.at(i) << "n"; // используем метод at() для доступа к элементам вектора
}
cout << endl;
}

catch (const std::exception& e) { // перехватываем исключение типа std::exception
cout << "Error: " << e.what() << endl; // выводим сообщение об ошибке
return 1;
}

return 0;
}


В этом коде мы используем метод at() для доступа к элементам вектора, который генерирует исключение типа std::out_of_range, если индекс находится за пределами диапазона вектора. Мы также перехватываем исключение типа std::exception, чтобы обработать любые другие исключения, которые могут возникнуть в программе.
Олег Шаймиев Я уже пробовал обращаться к chatgpt, не помогает