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

Как перебросить исключение дальше в обработчике исключения? - C++

Восстановить пароль Регистрация
 
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
07.09.2012, 22:27     Как перебросить исключение дальше в обработчике исключения? #1
Допустим, я работаю с сетью и пытаюсь обратиться к некторому хосту и если он не отвечает, то бросается исключение-объект наследник std::exception. Я должен максимум 5 раз перехватить это исключение, а на 6 раз бросить его дальше. Как лучше всего это реализовать?
Пока скелет примерно такой, что мне надо добавить сюда или как его отредактировать, чтобы работало как я прошу
C++
1
2
3
4
5
6
7
8
9
10
11
for (int c = 0; c < 5 && !requestSuccess; ++c)
{
         try
         {
            doRequest(GET, getUrl, htmlByteArray);
            requestSuccess = true;
         } catch (ConnectionException &e)
         {
            continue;
         }
}
Пока только вариант вроде throw (e)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2012, 22:27     Как перебросить исключение дальше в обработчике исключения?
Посмотрите здесь:

Как быть дальше? C++
C++ Куда и как двигаться дальше?
C++ Исключения, возврат кодов ошибок, assert и 1 вопрос про исключение.
Как заставить программу не выгружаться из памяти и работать дальше? C++
C++ Как свиртуализировать исключения?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
07.09.2012, 22:31     Как перебросить исключение дальше в обработчике исключения? #2
Сделать throw в блоке catch если 5 раз перехватил.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
07.09.2012, 22:32  [ТС]     Как перебросить исключение дальше в обработчике исключения? #3
Герц, т.е. просто throw? без передачи ему всяких объектов?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
07.09.2012, 22:32     Как перебросить исключение дальше в обработчике исключения? #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int c = 0; c < 6; ++c)
{
    try
    {
        doRequest(GET, getUrl, htmlByteArray);
        break;
    }
    catch (ConnectionException &e)
    {
        if (c == 5)
        {
            throw e;
        }
    }
}
же
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
07.09.2012, 22:33     Как перебросить исключение дальше в обработчике исключения? #5
throw того же самого исключения, что ты перехватываешь. Только вот с эллипсисом такое не прокатит, но наверняка можно что-то придумать. Да и обычно ты четко знаешь, какие исключения могут произойти.
P.S. Опа, Nick Alte ответил. Правда такой код имеет место
C++
1
2
3
catch ( ... ) {
    throw;
}
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
07.09.2012, 22:33     Как перебросить исключение дальше в обработчике исключения? #6
Цитата Сообщение от Buckstabue Посмотреть сообщение
просто throw? без передачи ему всяких объектов?
Да, именно так. Работает только внутри блока catch, при этом исключение распространяется уже за пределы блока, содержащего catch.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.09.2012, 22:52     Как перебросить исключение дальше в обработчике исключения? #7
Цитата Сообщение от Buckstabue Посмотреть сообщение
Я должен максимум 5 раз перехватить это исключение
в блоке catch должна быть переменная, которая инкрементируется при каждом входе

Добавлено через 13 минут
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
int main()
{
    int i;
    
    i = 1;
    while (1)
        try {
            cout << i << endl;
            throw 1;
        } catch (int e) {
            cout << "See: " << e << endl;
            if (i++ >= 5)
                throw;
        }
    return 0;
}
Код
[guest@localhost tests]$ .iso++ t.cpp -o t
[guest@localhost tests]$ ./t
1
See: 1
2
See: 1
3
See: 1
4
See: 1
5
See: 1
terminate called after throwing an instance of 'int'
Аварийный останов
[guest@localhost tests]$
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2012, 00:34     Как перебросить исключение дальше в обработчике исключения?
Еще ссылки по теме:

Как бросать эти исключения? C++
Как правильно вызывать исключения? C++
Как создавать информативные исключения? C++

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

Или воспользуйтесь поиском по форуму:
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
08.09.2012, 00:34  [ТС]     Как перебросить исключение дальше в обработчике исключения? #8
accept, ясно, т.е. можно отказаться от вспомогательной переменной requestSuccess
Но у вас не предусмотрен нормальный выход из цикла. Т.е. если исключения не кидаются, то цикл все равно продолжается
Yandex
Объявления
08.09.2012, 00:34     Как перебросить исключение дальше в обработчике исключения?
Ответ Создать тему

Метки
исключения
Опции темы

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