Регистрация
2 Апр 2013
Сообщения
80
Репутация
0
Спасибо
0
Монет
0
Есть следующий код:



#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 << "\n";

}

cout << endl;

}



catch (std::eek:ut_of_range) {

cout << "Index out of range!\n";

return 1;

}



return 0;

}



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

Вот только проблема в том, что она не перехватывается catch'ем.



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



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



Заранее спасибо!
 
оператор [] осуществляет доступ без проверки на диапазон, поэтому не выбрасывает исключений.
UPD:: а правильный ответ от Айрана не заметил)
 
попробуйте использовать at(i) вместо чтобы вектор мог генерировать исключения
operator[] не должен проверять выход за границы
 
Попробуйте так:
catch (std::eek:ut_of_range e)
 
Проблема заключается в том, что выход за границы вектора не является исключением типа std::eek:ut_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::eek:ut_of_range, если индекс находится за пределами диапазона вектора. Мы также перехватываем исключение типа std::exception, чтобы обработать любые другие исключения, которые могут возникнуть в программе.
 
Назад
Сверху