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

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

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

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

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

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

Обработка исключений с пмощью структурированной обработки исключений - C++
Есть функция, которая определенным образом работает с файлами,но при работе с файлами "не подходящего" типа вызывается необработанное...

Обработка исключений - C++
Доброго времени суток. Использую RAD XE 4. Пытаюсь поймать исключения путем catch(Exeption &E) { } Но компилятор...

Обработка исключений - C++
Добрый день! Столкнулся с такой проблемой. У меня есть класс class MyClass { public: MyClass(/* какие то параметры*/); ...

Обработка исключений - C++
Подскажите пожалуйста как продолжить выполнение программы после срабатывания оператора catch. catch завершает программу, но ее нужно...

обработка исключений - C++
Здравствуйте. В следующем коде, при запуске throw выдает ошибку "Exception object adress". Не понимаю почему. Подскажите пожалуйста. ...

Обработка исключений - C++
Надо отловить ввод данных некорректного типа. Объясните пожалуйста на конкретном примере, как это правильно сделать. #include...

10
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
02.11.2012, 19:42 #2
Egor138, Создавались они первоначально, чтобы как раз иметь способ возвращать ошибки из конструкторов (возвращаемого значения ведь у конструктора нет). Просто почитайте про обработку исключений в С++ и не только. Поймете.
1
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
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(...)  //Перехват всех неперехваченных исключений 
{
 
}
1
Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
02.11.2012, 20:35  [ТС] #4
А можете какой нибудь конкретный пример привести, например при делении на ноль
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
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 минуты
Да. и учите классы
1
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";
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
02.11.2012, 20:52 #7
выражением throw ""; я генерирую исключение типа строка

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

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

если бы я написал catch(...) {} - это перехват все видов исключений
1
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 и почему там указатель??
0
no_wearines
53 / 49 / 2
Регистрация: 01.01.2012
Сообщений: 332
02.11.2012, 21:07 #9
чем отличается cout от throw
cout - ото простой оператор поместить в поток
Ошибки (исключения) бывают разные (ошибка выделения памяти и многие другие систмные ошибки)
при генерации исключения вызывается его обработка (та что в catch) если непредусмотрена обработка вызывается функция unexpected -обработка безымянный исключений после terminate а после abort. Все эти функции можно заменить своими (читайте книги для начинающих).

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

Добавлено через 12 секунд
читайте книги.
отбой
1
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
02.11.2012, 21:30 #10
Можете привести какой нибудь простой пример без классов
Хочешь писать на C++ - используй классы, иначе ты пишешь на "Ц с классами".
1
silent_1991
Эксперт С++
4985 / 3042 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
07.11.2012, 14:35 #11
Egor138, вы хотели пример без классов, вам таковой привели. На самом же деле вся мощь исключений проявляется при использовании классов. Я говорю не про использование исключений в методах классов, исключения можно кидать и из обычных функций. Я говорю о том, что в качестве исключения можно (и даже нужно) выбрасывать объект класса. Суть в том, что можно создать иерархию исключений - дерево классов, каждый из которых описывает некоторую ошибку. При этом все подклассы некоторого базового класса-исключения (он и сам может быть производным от более "широкого" исключения) должны уточнять исключения, от которого они наследуют. Такие вещи компилятор, само собой, контролировать никак не может, поэтому имеется ввиду, что разработчик должен логически выстроить иерархию. С точки зрения компилятора можно унаследовать исключение "Деление на нуль" от исключения "Выход за границы массива", с точки зрения логики же это глупо.
Таким образом тип ошибки как раз идентифицируется классом исключения. Каждый оператор catch ловит свой тип исключения (а также исключения, унаследованные от того типа, который он ловит), и в зависимости от этого можно писать на каждый тип ошибки свою логику обработки. Логика эта, заметьте, не ограничивается выводом сообщения на экран и завершением работы программы. Как раз наоборот, в идеальном случае восстановление после ошибки должно пройти незаметно и безболезненно для пользователя. Есть, разумеется, случаи (и их немало), когда так сделать не получится, но к этому стоит стремиться.
0
07.11.2012, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2012, 14:35
Привет! Вот еще темы с ответами:

Обработка исключений - C++
Ребят, всем привет) помогите разобраться с вроде как простой задачкой, но весьма затруднительной для меня) По исключениям инфы мало в...

Обработка исключений - C++
Нужно описать класс исключения и программу, способную генерировать и обрабатывать исключение (должна содержать блоки try, catch, throw)....

Обработка исключений - C++
Помогите написать программу пожалуйста!!!! Я незнаю как правильно написать!!! Задание: Для каждого варианта необходимо создать три...

Обработка исключений - C++
Есть код программы по поиску совершенных чисел а интервале от a до n. #include &lt;iostream&gt; using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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