Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2012, 15:58   #1
Trigger man
Пользователь
 
Аватар для Trigger man
 
Регистрация: 03.05.2012
Сообщений: 21
По умолчанию Обработка ошибок диапазона

Здравствуйте. Помогите разобраться с такой проблемой.
Сейчас в книге нашел вот такой пример. Сначала вводятся некоторое количество положительных целых чисел и они записываются в конец вектора. Для завершения ввода нужно ввести любое отрицательное число.
Здесь специально предусмотрена ошибка выхода за границы вектора. Но она почему-то не отлавливается. То есть программа просто аварийно завершается и выходит сообщение об ошибке.
Просто никак не могу понять, почему то, что написано в блоке catch не выполняется?

Код:
int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(0, "russian");

	vector<int> v;		// вектор целых чисел


	try
	{
		int x;
		while ( (cin >> x) && (x>=0) ) v.push_back(x);
		for (int i=0; i<=v.size(); ++i)
			cout << "v[" << i << "] == " << v[i] << endl;
	}
	catch (out_of_range)
	{
		cerr << "Ой! Ошибка диапазона" << endl;
		cout << "Для выхода нажмите любую клавишу ... ";
		cin.get();
		return 1;
	}


	cout << "\n\n";
	system("pause");
	return 0;
}
Никто не знает?

Последний раз редактировалось Trigger man; 08.05.2012 в 16:24.
Trigger man вне форума Ответить с цитированием
Старый 08.05.2012, 16:29   #2
SergeyCh
Пользователь
 
Регистрация: 22.04.2012
Сообщений: 27
По умолчанию Обработка ошибок диапазона

Вы не обрабатываете ошибку ввода (отрицательное) и программа завершается по "утверждению" (assertion).
Вот так будет обрабатывать исключение -
Код:
 
#include <iostream>
#include <vector>

using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(0, "russian");
	vector<int> v;	// вектор целых чисел
	try
	{
		int x;
		while ( (cin >> x) && (x>=0) ) v.push_back(x);
		if (x < 0)
                     throw "Can not take negative number"; 
		for (int i=0; i<=v.size(); ++i)
		    cout << "v[" << i << "] == " << v[i] << endl;
	}

	catch (char* strException ) 
        {
             cerr << "Caught: " << strException<<endl;
        };
	
	cout << "\n\n";
	system("pause");
	return 0;
}
Вот пример MSDN out_of_range Class по обработке out_of_range -
Код:
// out_of_range.cpp
// compile with: /EHsc
#include <string>
#include <iostream>

using namespace std;

int main() {
// out_of_range
   try {
      string str( "Micro" );
      string rstr( "soft" );
      str.append( rstr, 5, 3 );
      cout << str << endl;
   }
   catch ( exception &e ) {
      cerr << "Caught: " << e.what( ) << endl;
   };
}

Последний раз редактировалось SergeyCh; 08.05.2012 в 16:34.
SergeyCh вне форума Ответить с цитированием
Старый 08.05.2012, 16:29   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Видимо out_of_range это исключение которое генерируется не оператором [], а функцией vector::at()
Код:
int main()
{
	vector<int> v;
	v.push_back(1);
	try
	{
		for (int i=0; i <= v.size(); ++i)
			cout << "v[" << i << "] == " << v.at(i) << endl;
	}
	catch (out_of_range)
	{
		cerr << "Err\n" << endl;
	}

	system("pause");
	return 0;
}
SergeyCh , автору нужно исключение не при вводе отрицательного числа, а при выходе за пределы диапазона массива.

Последний раз редактировалось EUGY; 08.05.2012 в 16:35.
EUGY вне форума Ответить с цитированием
Старый 08.05.2012, 16:58   #4
Trigger man
Пользователь
 
Аватар для Trigger man
 
Регистрация: 03.05.2012
Сообщений: 21
По умолчанию

EUGY, Вот так все правильно получается. Спасибо. Хотя вот непонятно, почему же в книге Страуструпа совсем по другому написано. Ну неважно. Главное программа правильно работает и хорошо.
И SergeyCh тоже чем-то помог. Теперь хоть буду знать как при отрицательных числах исключения генерировать.
Trigger man вне форума Ответить с цитированием
Старый 08.05.2012, 17:02   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
почему же в книге Страуструпа совсем по другому написано. Ну неважно.
Может и важно. А что он говорит по этому поводу?
EUGY вне форума Ответить с цитированием
Старый 08.05.2012, 17:10   #6
Trigger man
Пользователь
 
Аватар для Trigger man
 
Регистрация: 03.05.2012
Сообщений: 21
По умолчанию

Вот скриншот сделал. Тут ни слова нет про функцию at() а просто используются квадратные скобки v[i]
Изображения
Тип файла: jpg ошибки диапазона.jpg (48.0 Кб, 17 просмотров)
Trigger man вне форума Ответить с цитированием
Старый 08.05.2012, 17:19   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Мда, старикан погорячился с примером ...
EUGY вне форума Ответить с цитированием
Старый 08.05.2012, 17:24   #8
Trigger man
Пользователь
 
Аватар для Trigger man
 
Регистрация: 03.05.2012
Сообщений: 21
По умолчанию

Цитата:
Мда, старикан погорячился с примером ...
Ну да. А потом сидишь и думаешь "А что же не так? Где ошибка? Вроде все правильно написал с книги, а все равно программа не работает". Ну хоть вы мне помогли. Спасибо.
Trigger man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка ошибок mikebrownen Общие вопросы C/C++ 1 21.10.2011 09:51
Обработка ошибок kardinal94 Общие вопросы Delphi 2 21.11.2010 20:23
Обработка ошибок Liones БД в Delphi 12 04.12.2008 07:22
Обработка ошибок Ivanich JavaScript, Ajax 1 24.04.2008 22:49
Обработка ошибок. Serviceprofi Помощь студентам 7 19.11.2007 15:12