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

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

Войти
Регистрация
Восстановить пароль
 
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
#1

Обработка исключений - C++

02.11.2012, 19:41. Просмотров 774. Ответов 10
Метки нет (Все метки)

Объясните мне толком для чего используются эти обработки исключений (Try, catch, throw).
Сколько не читаю, не могу понять для чего и как это все используется... Можете привести какой нибудь простой пример без классов(везде где читал про исключения используются в примерах классы).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2012, 19:41     Обработка исключений
Посмотрите здесь:

C++ обработка исключений
C++ Обработка исключений
Обработка исключений C++
Обработка исключений C++
Обработка исключений C++
Обработка исключений C++
Обработка исключений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.11.2012, 19:42     Обработка исключений #2
Egor138, Создавались они первоначально, чтобы как раз иметь способ возвращать ошибки из конструкторов (возвращаемого значения ведь у конструктора нет). Просто почитайте про обработку исключений в С++ и не только. Поймете.
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 323
02.11.2012, 20:02     Обработка исключений #3
В блок try{} заключается код, который может сгенерировать исключение
В блок catch(тип генерируемого исключения) заключается действия, которые необходимо предпринять при перехвате исключения указанного типа
Предложение throw генеррует исключение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
try
{
throw 5; //Сгенерировать исключение целого типа
 
}
catch(int e) //перехватить исключение целого типа, но только целого
{
cout<<e; 
}
catch(...)  //Перехват всех неперехваченных исключений 
{
 
}
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
02.11.2012, 20:35  [ТС]     Обработка исключений #4
А можете какой нибудь конкретный пример привести, например при делении на ноль
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 323
02.11.2012, 20:45     Обработка исключений #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
int q_1, q_2;
try
{
cin>>q_1>>q_2;
 
if(q_2 == 0)
throw "Error";
}
catch(char *s_1) //Тип генерируемого исключения
{
cout<<s_1;
}
Это самый простой и поверхностный вариант
Предлагаю обратиться к книге:
Солтер Николас А. и др. - С++ для профессионалов - 2006
Там прилично освещается тема исключений

Добавлено через 2 минуты
Да. и учите классы
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
02.11.2012, 20:49  [ТС]     Обработка исключений #6
А для чего эта часть кода
C++
1
2
3
4
            catch(char *s_1) //Тип генерируемого исключения
            {
                cout<<s_1;
            }

И почему нельзя заменить

C++
1
2
3
4
5
6
7
try
{
cin>>q_1>>q_2;
 
if(q_2 == 0)
throw "Error";
}
на

C++
1
2
cin>>q_1>>q_2;
if(q_2 == 0)  cout<<"Error";
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 323
02.11.2012, 20:52     Обработка исключений #7
выражением throw ""; я генерирую исключение типа строка

блок catch(char *s_1) - означает перехватить исключение типа строка

если я сгенерировал бы throw 5; обработчик catch(char *s_1) не сработал бы так исключение другого типа

если бы я написал catch(...) {} - это перехват все видов исключений
Egor138
 Аватар для Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
02.11.2012, 21:01  [ТС]     Обработка исключений #8
Цитата Сообщение от no_wearines Посмотреть сообщение
выражением throw ""; я генерирую исключение типа строка

блок catch(char *s_1) - означает перехватить исключение типа строка

если я сгенерировал бы throw 5; обработчик catch(char *s_1) не сработал бы так исключение другого типа

если бы я написал catch(...) {} - это перехват все видов исключений
Это значит ifОМ я могу поймать только конкретное значение, а с помощью Catch я могу поймать любое значение любого типа ?? Я правильно понимаю?

Добавлено через 3 минуты
Цитата Сообщение от no_wearines Посмотреть сообщение
блок catch(char *s_1) - означает перехватить исключение типа строка
А почему тип стока, а в скобках char *s_1 а не string s_1 и почему там указатель??
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 323
02.11.2012, 21:07     Обработка исключений #9
чем отличается cout от throw
cout - ото простой оператор поместить в поток
Ошибки (исключения) бывают разные (ошибка выделения памяти и многие другие систмные ошибки)
при генерации исключения вызывается его обработка (та что в catch) если непредусмотрена обработка вызывается функция unexpected -обработка безымянный исключений после terminate а после abort. Все эти функции можно заменить своими (читайте книги для начинающих).

Добавлено через 37 секунд
вы маньяк.

Добавлено через 12 секунд
читайте книги.
отбой
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.11.2012, 21:30     Обработка исключений #10
Можете привести какой нибудь простой пример без классов
Хочешь писать на C++ - используй классы, иначе ты пишешь на "Ц с классами".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2012, 14:35     Обработка исключений
Еще ссылки по теме:

Обработка исключений C++
Обработка исключений C++
C++ Обработка исключений
Обработка исключений C++
C++ Обработка исключений

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
07.11.2012, 14:35     Обработка исключений #11
Egor138, вы хотели пример без классов, вам таковой привели. На самом же деле вся мощь исключений проявляется при использовании классов. Я говорю не про использование исключений в методах классов, исключения можно кидать и из обычных функций. Я говорю о том, что в качестве исключения можно (и даже нужно) выбрасывать объект класса. Суть в том, что можно создать иерархию исключений - дерево классов, каждый из которых описывает некоторую ошибку. При этом все подклассы некоторого базового класса-исключения (он и сам может быть производным от более "широкого" исключения) должны уточнять исключения, от которого они наследуют. Такие вещи компилятор, само собой, контролировать никак не может, поэтому имеется ввиду, что разработчик должен логически выстроить иерархию. С точки зрения компилятора можно унаследовать исключение "Деление на нуль" от исключения "Выход за границы массива", с точки зрения логики же это глупо.
Таким образом тип ошибки как раз идентифицируется классом исключения. Каждый оператор catch ловит свой тип исключения (а также исключения, унаследованные от того типа, который он ловит), и в зависимости от этого можно писать на каждый тип ошибки свою логику обработки. Логика эта, заметьте, не ограничивается выводом сообщения на экран и завершением работы программы. Как раз наоборот, в идеальном случае восстановление после ошибки должно пройти незаметно и безболезненно для пользователя. Есть, разумеется, случаи (и их немало), когда так сделать не получится, но к этому стоит стремиться.
Yandex
Объявления
07.11.2012, 14:35     Обработка исключений
Ответ Создать тему
Опции темы

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