Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,920
Записей в блоге: 1
#1

Ошибка в исключениях - C++

26.12.2011, 13:28. Просмотров 537. Ответов 5
Метки нет (Все метки)

Вот код с исключением:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <vector>
#include <string.h>
#include <locale.h>
using namespace std;
void error (string s);
int main()
{
    setlocale(LC_ALL, "Rus");
    try {
        vector<int> v;
        int x;
        while (cin >> x)
            v.push_back(x);
        for (int i=0; i<=v.size(); i++)
            cout << "a[" << i << "] == " << v[i] << endl;
        } 
    catch (out_of_ranger) 
    {
        cerr << "Ой! не тот диапазон";
        return 1;
    } catch (...)
    {
        cerr << "Что то не так пошло";
        return 2;
    }
 
 
    system("pause");
    return 0;
}
void error (string s)
{
 
    throw runtime_error(s);
}
вот ошибки:
d:\my programs\задание по с++\10\исключение\исключение\исключение.cpp(15): warning C4018: <=: несоответствие типов со знаком и без знака
d:\my programs\задание по с++\10\исключение\исключение\исключение.cpp(18): error C2061: синтаксическая ошибка: идентификатор "out_of_ranger"
d:\my programs\задание по с++\10\исключение\исключение\исключение.cpp(18): error C2310: в блоках catch должен быть указан один тип

как их устранить?

И как ваше работает исключение(код с книги писал)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.12.2011, 13:28     Ошибка в исключениях
Посмотрите здесь:

Бесконечный цикл при исключениях - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;exception&gt; #include &lt;locale.h&gt; using namespace std; int...

Запрос об исключениях - MS Access
Вообщем, такая идея, есть запрос, в котором есть данные о ремонтах принтеров. Нужно сделать отчет о так званых &quot;Надежных&quot; принтерах, то...

Сбрасываются настройки прокси в исключениях в IE11 - Windows 7
Извиняюсь если тема была, в поиске не нашёл. Периодически (раз в час) слетают настройки исключений прокси-сервера в браузере IE 11. ...

При всех ли исключениях возникает событие OnException - Delphi
Application.OnException перехватывает все исключения? например, есть Application.OnException := DoException; procedure...

Брандмауэр спрашивает о разрешении запуска Mail.Ru Агента, хотя тот находится в исключениях - Windows 7
Здравствуйте. Я поставил в свойствах mail.ru агента, чтобы он запускался в режиме совместимости с windows xp, так как его нельзя убрать...

IIS- asp ошибка: HTTP 500.100 - Внутренняя ошибка сервера - ошибка ASP Internet Information Services - C# ASP.NET
Привет! Конфигурация win2000pro sp2, стандартный IIS, IE 5. При попытке обратиться к сценарию(asp) получаю ошибку: &lt;пропуск&gt; ......

1C 8.x Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове метода контекста (ПрочитатьИзменения): Ошибка записи! - 1С
Доброго всем времени суток! подскажи пожалуйста как исправить ошибку: Ошибка при чтении изменений при обмене РИБ: Ошибка при вызове...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
5474 / 1840 / 342
Регистрация: 10.12.2010
Сообщений: 5,430
Записей в блоге: 3
26.12.2011, 14:20     Ошибка в исключениях #2
Цитата Сообщение от Sylar9 Посмотреть сообщение
out_of_ranger
А не out_of_range ли?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.12.2011, 15:15     Ошибка в исключениях #3
Sylar9, по порядку:
1. std::out_of_range объявлен в заголовке stdexcept. Необходимо подключить:
C++
1
#include <stdexcept>
2. operator[] у вектора не проверяет выход за границы массива. Это делает метод с названием at().
C++
1
cout << "a[" << i << "] == " << v.at(i) << endl;
3. std::out_of_range - это тип. Такой класс есть Нельзя создать безымянный экземпляр класса.
C++
1
catch (out_of_range e)
4. ну и наконец избавляемся от warning'а:
C++
1
for (vector<int>::size_type i = 0; i <= v.size(); i++)
Итоговый код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdexcept>
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
        try {
           vector<int> v(2);
           
           for (vector<int>::size_type i = 0; i <= v.size(); i++)
              cout << "a[" << i << "] == " << v.at(i) << endl;
        } 
        
        catch (const out_of_range &e) 
        {
            cerr << "Out of range : " << e.what() << endl;
                return 1;
        } 
        catch (...)
        {
            cerr << "Smth is wrong" << endl;
                return 2;
        }
 
        return 0;
}
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,920
Записей в блоге: 1
26.12.2011, 15:30  [ТС]     Ошибка в исключениях #4
Цитата Сообщение от fasked Посмотреть сообщение
Sylar9, по порядку:
1. std::out_of_range объявлен в заголовке stdexcept. Необходимо подключить:
C++
1
#include <stdexcept>
2. operator[] у вектора не проверяет выход за границы массива. Это делает метод с названием at().
C++
1
cout << "a[" << i << "] == " << v.at(i) << endl;
3. std::out_of_range - это тип. Такой класс есть Нельзя создать безымянный экземпляр класса.
C++
1
catch (out_of_range e)
4. ну и наконец избавляемся от warning'а:
C++
1
for (vector<int>::size_type i = 0; i <= v.size(); i++)
Итоговый код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdexcept>
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
        try {
           vector<int> v(2);
           
           for (vector<int>::size_type i = 0; i <= v.size(); i++)
              cout << "a[" << i << "] == " << v.at(i) << endl;
        } 
        
        catch (const out_of_range &e) 
        {
            cerr << "Out of range : " << e.what() << endl;
                return 1;
        } 
        catch (...)
        {
            cerr << "Smth is wrong" << endl;
                return 2;
        }
 
        return 0;
}
а как на этом примеры работает исключения, Я не как нем могу понять?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
26.12.2011, 16:44     Ошибка в исключениях #5
Sylar9, метод at() бросает исключение в случае, если происходит попытка обращению к элементу по индексу, который выходит за границы массива.
Банальный пример:
C++
1
2
int arr[5] = { 0 };
arr[10] = 0; // выход за границу массива
Так вот метод at() как раз такие случаи и отлавливает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdexcept>
#include <iostream>
#include <vector>
 
using namespace std;
 
int main()
{
   // Создание вектора из двух элементов
   vector<int> v(2);
   
   try {
      // Легальное обращение к элементу вектора
      v.at(0) = 1;
   }
   
   // Исключение не будет брошено
   catch (const out_of_range &e) {
      cerr << "never be executed : " << e.what() << endl;
   }   
   
   try {
      // Обращение к несуществующему элементу - выход за границу массива
      // т.е. i >= v.size()
      v.at(10) = 1;
   }
        
   // Исключение будет брошено,
   // а обращение к неверному адресу предотвращено
   catch (const out_of_range &e) {
      cerr << "out of range : " << e.what() << endl;
   }
}
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
26.12.2011, 16:56     Ошибка в исключениях #6
Цитата Сообщение от fasked Посмотреть сообщение
std::out_of_range - это тип. Такой класс есть Нельзя создать безымянный экземпляр класса.
а он тут и не создается Он тут только отлавливается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
class empty
{
};
 
int main()
{
    try
    {
    throw empty();
    }
    catch (empty)
    {
    std::cout << "Caught" << std::endl;
    }
}
по аналогии с формальным параметром функции, фактическое значение которого нас не интересует:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class empty
{
};
 
int foo(empty)
{
    return 0;
}
 
int main()
{
    return foo(empty());
}
Yandex
Объявления
26.12.2011, 16:56     Ошибка в исключениях
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru