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

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

Войти
Регистрация
Восстановить пароль
 
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,222
Записей в блоге: 27
#1

Разъясните подробно, как работают Try-catch - C++

11.03.2014, 18:44. Просмотров 580. Ответов 9
Метки нет (Все метки)

Добрый вечер, форумчане! Такая просьба - разъясните нубасу(то бишь мне) подробно как работает try catch throw или киньте ссылки, где это объясняется. По гуглу шарилась, но, увы, мой мозг не был удостоен понимания этого.
Если можно - с примерами и комментариями. Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2014, 18:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разъясните подробно, как работают Try-catch (C++):

Не работают try-catch в visual studio 2010 - C++
Не работают try-catch в visual studio 2010. Лет пять назад, в vs 2008, все работало, в Qt 5.6 MINGW также все работает. Вот пример...

Разъясните как чайничку :) - C++
Ребята, кому не трудно, объясните недолекому человеку, как и с чем едят "механизм передачи неопределенного числа параметров". Вот хоть...

разъясните,пожалуйста, как это сделать? - C++
Дано целое число N (> 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки чередуются). Условный оператор не...

Разъясните эту строку как мне это привязать к функции - C++
double (*func4 (double, double)); - как это привязать к функции, как я понимаю это масив указателей на функцию, но она почему то не...

как работает try, catch - C++
Как работает конструкция try, catch? Если не сложно объясните на не большом примере. А то гугли читал в книги так не могу понять ее...

Как работать с try - catch в С++? - C++
Доброго времени суток. Подскажите плиз как именно работает try catch? Я попробовал сделать вот так: void f1() { int i = 5; int j...

9
SatanaXIII
Супер-модератор
Эксперт С++
5640 / 2675 / 252
Регистрация: 01.11.2011
Сообщений: 6,572
Завершенные тесты: 1
11.03.2014, 18:54 #2
Тамика, как на счет отправиться в поиск по форуму вот этой темы: Try..catch..Throw

Или в чем именно вопрос?
1
Progers
New to C++
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
11.03.2014, 18:57 #3
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>
 
using namespace std;
class test
{
private:
    int in[10];
public:
    class error{}; // Класс для исключения или ошибки...
    void get() //метод класса
    {
        for(int a = 0;a <= 10; a++)
        {
            in[a] = a;
            if(a >= 10)
            {
                throw error(); //Говорим об ошибке если (a) будет больше 10
            }
        }
    }
};
 
int main()
{
    try // блок повторении(проверка)
    {
        test t1;
        t1.get();
    }
    catch(test::error) // Ловим ошибку
    {
        cerr << "Error"; // выводим на экран ошибке
    }
 
    return 0;
}
1
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,222
Записей в блоге: 27
11.03.2014, 19:04  [ТС] #4
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Или в чем именно вопрос?
Сейчас перечитаю всё и задам, если не пойму. Спасибо.

Добавлено через 5 минут
Блин. Вот убейте, но не могу понять.
throw - что делает этот оператор? И почему catch() реагирует на throw? Как они связаны между собой?
0
SatanaXIII
Супер-модератор
Эксперт С++
5640 / 2675 / 252
Регистрация: 01.11.2011
Сообщений: 6,572
Завершенные тесты: 1
11.03.2014, 19:08 #5
Цитата Сообщение от Тамика Посмотреть сообщение
throw - что делает этот оператор?
throw (от англ. бросать) - бросает исключение. Генерирует. Создает вот прям сейчас.
Цитата Сообщение от Тамика Посмотреть сообщение
почему catch() реагирует на throw?
Так его задумка такая. Ждать пока/если возникнет исключение и поймать его, то ест обработать.

Они созданы друг для друга.
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
11.03.2014, 19:32 #6
Цитата Сообщение от Тамика Посмотреть сообщение
throw - что делает этот оператор? И почему catch() реагирует на throw? Как они связаны между собой?
throw создает временный объект, объект исключения, в специальной области памяти (особенности этой памяти не регламентированы, зависят от реализации), главное ее назначение - сохранить объект исключения пока будет раскручиваться стек.
После того как объект исключения сохранен, поток управления начинает работать в обратном направлении, пока не будет достигнуто начало блока try. В этом месте параметры определенных нами catch блоков начинаются сравниваться с сохраненным исключением, чтобы определить совпадение. Если совпадения не найдено, то поток управления продолжает разматывать стек до следующего блока try и т.д. Если блок try не был найден, то срабатывает глобальный обработчик, который вызывает std::terminate(). Если совпадение найдено, поток управления переходит к соответствующему catch блоку (обработчику исключений), который выполняется как обычно. В процессе раскрутки стека вызываются в порядке обратном созданию деструкторы всех автоматических объектов, которые были к тому моменту полностью созданы.
1
vvm28
Учусь всегда.
19 / 20 / 4
Регистрация: 22.12.2013
Сообщений: 208
Записей в блоге: 11
Завершенные тесты: 1
26.02.2017, 19:41 #7
DrOffset, Подскажите пожалуйста. Предположим я написал
Try-catch.
В секции catch я как-бы по моему мнению обработал ошибку.
Могу ли я передать управление из catch обратно программе без её аварийного завершения?
0
GbaLog-
Любитель чаепитий
3074 / 1413 / 341
Регистрация: 24.08.2014
Сообщений: 5,015
Записей в блоге: 1
Завершенные тесты: 2
26.02.2017, 19:51 #8
Цитата Сообщение от vvm28 Посмотреть сообщение
Могу ли я передать управление из catch обратно программе без её аварийного завершения?
Если исключение перешло в catch секцию, то программа продолжит своё выполнение после этой секции, пример:
http://rextester.com/ULZ12367
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//g++  5.4.0
 
#include <iostream>
 
int main()
{
    try
    {
        throw 1;
    }
    catch(int)
    {
        std::cout << "I catch you!\n";
    }
    
    std::cout << "Hello, world!\n";
}
Как видите, Hello, world! было выведено.
0
vvm28
Учусь всегда.
19 / 20 / 4
Регистрация: 22.12.2013
Сообщений: 208
Записей в блоге: 11
Завершенные тесты: 1
26.02.2017, 20:02 #9
GbaLog-, Спасибо. А если, например,
я обернул ввод пользователя в try- catch и
нужно заставить пользователя повторить ввод или это плохая идея?
0
altmax
181 / 48 / 14
Регистрация: 23.12.2016
Сообщений: 157
Завершенные тесты: 1
26.02.2017, 20:43 #10
Цитата Сообщение от vvm28 Посмотреть сообщение
GbaLog-, Спасибо. А если, например,
я обернул ввод пользователя в try- catch и
нужно заставить пользователя повторить ввод или это плохая идея?
Ввод пользователя лучше проверять обычными средствами сразу после ввода. try- catch используются обычно там, где от человека мало что зависит - например считать данные из файла. Файл может быть недоступен, данные, которые в нём содержатся, могут быть совсем не теми, что надо - в этих случаях и стоит генерировать исключения, а после их ловить.
0
26.02.2017, 20:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2017, 20:43
Привет! Вот еще темы с ответами:

Выполнить проверку за 7 дней как подробно разобрать каждый день? - C++
#include &lt;iostream&gt; using namespace std; int main() { float res = 10, n = 7, k = 10; for( int i = 0; i &lt; n;...

Не понимаю как сделать try/catch в программе - C++
в общем, у меня стек заполняется только целочисленным типом данных (int). Но также необходимо сделать исключения для типа double и букв...

Объясните пожалуйста, как работать с try catch и throw - C++
как следует работать с try catch и throw. никак не могу понять как применить их в программе

Обработка любых исключений в try catch на C++ также как на C# - C++
Есть ли возможность обрабатывать все ошибки в программе на C++, точно также как это сделано на C#? На C# просто помещаешь текст...


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

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

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