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

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

Войти
Регистрация
Восстановить пароль
 
Gepar
 Аватар для Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
#1

Разобраться с исключениями - C++

01.06.2011, 18:35. Просмотров 383. Ответов 4
Метки нет (Все метки)

Накопилось пара вопросов по исключениям.
Собственно мой класс исключений производный от стандартного класса runtime_error, ничего особенного не делает, только для теста.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdexcept>
#include <string>
using namespace std;
 
class re1: public runtime_error
{
    public:
    re1(string a)
    :runtime_error(a)
    {
        cout<<"\nre1 is running";
    }
};
 
class re2: public runtime_error
{
    public:
    re2(string a)
    :runtime_error(a)
    {
        cout<<"\nre2 is running";
    }
};
Ну и дальше main и тут же вопрос, почему вот так
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
#include <iostream>
#include <stdexcept>
#include "re1.cpp"
using namespace std;
 
int main()
{
    cout<<"\nSTART";
    int a;
    cin>>a;
    try
    {
        cout<<"\nTRY BLOCK";
        if (a==0)
        {
            re1 a("RE1");
            throw a;
        }
        if (a==1)
        {
            re2 a("RE2");
            throw a;
        }
    }
    catch(runtime_error &x)
    {
        cout<<'\n'<<x.what()<<" is got";
    }
    return 0;
 
}
Мой catch(runtime_error &x) перехвачивает исключение re1 и re2.
А вот так
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
#include <iostream>
#include <stdexcept>
#include "re1.cpp"
using namespace std;
 
int main()
{
    cout<<"\nSTART";
    int a;
    cin>>a;
    try
    {
        cout<<"\nTRY BLOCK";
        if (a==0)
         re1 a("RE1");
        else
         re2 a("RE2");
        throw a;
    }
    catch(runtime_error &x)
    {
        cout<<'\n'<<x.what()<<" is got";
    }
    return 0;
 
}
Уже не перехвачивает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2011, 18:35     Разобраться с исключениями
Посмотрите здесь:

C++ хотелось бы разобраться
Разобраться с delete [] C++
C++ Надо разобраться
Нужно разобраться C++
C++ Немогу разобраться
Разобраться в функции C++
Как бороться с необработанными исключениями C++
C++ разобраться с очередью
Разобраться в коде C++
Что общего между исключениями процессора и исключениями С++? C++
функции с исключениями в наследовании C++
C++ работа с исключениями

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dihlofos
Бродяга
 Аватар для dihlofos
303 / 257 / 17
Регистрация: 27.08.2010
Сообщений: 553
01.06.2011, 18:56     Разобраться с исключениями #2
Gepar, зачем у вас переменная типа int и объекты типа re1, re2 имеют одинаковые имена (a)? В первом случае, ладно, объекты вы создаёте внутри блока {}, а во втором случае происходит throw a (где a - та самая переменная int)
Gepar
 Аватар для Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
01.06.2011, 22:44  [ТС]     Разобраться с исключениями #3
dihlofos, ага, но тогда оно не находит что ему нужно выбрасывать
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
#include <iostream>
#include <stdexcept>
#include "re1.cpp"
using namespace std;
 
int main()
{
    cout<<"\nSTART";
    int z;
    cin>>z;
    try
    {
        cout<<"\nTRY BLOCK";
        if (z==0)
         re1 a("RE1");
        else
         re2 a("RE2");
        throw a;
    }
    catch(runtime_error &x)
    {
        cout<<'\n'<<x.what()<<" is got";
    }
    return 0;
 
}
Ну и вот такие хитрости тогда тоже не помогают
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
#include <iostream>
#include <stdexcept>
#include "re1.cpp"
using namespace std;
 
int main()
{
    cout<<"\nSTART";
    int z;
    cin>>z;
    try
    {
        runtime_error *a;
        cout<<"\nTRY BLOCK";
        if (z==0)
          a= new re1("RE1");
        else
         a= new re2("RE2");
        throw a;
    }
    catch(runtime_error &x)
    {
        cout<<'\n'<<x.what()<<" is got";
    }
    return 0;
 
}
Добавлено через 2 часа 47 минут
В общем метод тыка показал что выбросить/вернуть с функции переменную созданную в условии if нельзя.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
01.06.2011, 22:52     Разобраться с исключениями #4
потому что перехватывать надо указатель
Gepar
 Аватар для Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,516
01.06.2011, 22:56  [ТС]     Разобраться с исключениями #5
Цитата Сообщение от OstapBender Посмотреть сообщение
потому что перехватывать надо указатель
А ведь и правда, вот так затупишь где-то и без подсказки не замечаешь.
Yandex
Объявления
01.06.2011, 22:56     Разобраться с исключениями
Ответ Создать тему
Опции темы

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