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

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

Восстановить пароль Регистрация
 
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
01.06.2011, 18:35     Разобраться с исключениями #1
Накопилось пара вопросов по исключениям.
Собственно мой класс исключений производный от стандартного класса 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++ не могу разобраться
C++ не могу разобраться
C++ Немогу разобраться
Как бороться с необработанными исключениями C++
C++ Разобраться с ответами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dihlofos
Бродяга
 Аватар для dihlofos
302 / 256 / 17
Регистрация: 27.08.2010
Сообщений: 553
01.06.2011, 18:56     Разобраться с исключениями #2
Gepar, зачем у вас переменная типа int и объекты типа re1, re2 имеют одинаковые имена (a)? В первом случае, ладно, объекты вы создаёте внутри блока {}, а во втором случае происходит throw a (где a - та самая переменная int)
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
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
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
01.06.2011, 22:56  [ТС]     Разобраться с исключениями #5
Цитата Сообщение от OstapBender Посмотреть сообщение
потому что перехватывать надо указатель
А ведь и правда, вот так затупишь где-то и без подсказки не замечаешь.
Yandex
Объявления
01.06.2011, 22:56     Разобраться с исключениями
Ответ Создать тему
Опции темы

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