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

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

Войти
Регистрация
Восстановить пароль
 
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
#1

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

07.09.2012, 22:27. Просмотров 525. Ответов 7

Допустим, я работаю с сетью и пытаюсь обратиться к некторому хосту и если он не отвечает, то бросается исключение-объект наследник 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)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2012, 22:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как перебросить исключение дальше в обработчике исключения? (C++):

Исключения, возврат кодов ошибок, assert и 1 вопрос про исключение. - C++
Как правильно выбирать в какой ситуации применять то, а в какой другое? Есть, конечно, очевидные ситуации, например, не открывается файл,...

Как правильно перебросить аргументы в variadic template? - C++
всем привет, можете помочь пж, есть такая ф-ция: template&lt;typename ... Args&gt; inline wstring WStrFormat(const wstring&amp; format, Args ......

Как быть дальше? - C++
День добрый. Собственно сложилась такая ситуация - Имеется огромное желание изучать дальше языки программирование, и все то, что с...

Куда и как двигаться дальше? - C++
Здравствуйте! Я совсем недавно начал изучение программирование и все мои знания в этой области были получены из книги Ритчи и Кернигана...

Как свиртуализировать исключения? - C++
Мне очень нравится как реализован перехват исключений в Python и Java: там в блоке catch не надо перечислять все виды исключений, а...

Как генерировать исключения? - C++
Как сгенерировать исключение. Как выход индекса за пределы допустимого диапозона. Изучаю API

7
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
07.09.2012, 22:31 #2
Сделать throw в блоке catch если 5 раз перехватил.
1
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
07.09.2012, 22:32  [ТС] #3
Герц, т.е. просто throw? без передачи ему всяких объектов?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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;
        }
    }
}
же
1
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
07.09.2012, 22:33 #5
throw того же самого исключения, что ты перехватываешь. Только вот с эллипсисом такое не прокатит, но наверняка можно что-то придумать. Да и обычно ты четко знаешь, какие исключения могут произойти.
P.S. Опа, Nick Alte ответил. Правда такой код имеет место
C++
1
2
3
catch ( ... ) {
    throw;
}
1
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
07.09.2012, 22:33 #6
Цитата Сообщение от Buckstabue Посмотреть сообщение
просто throw? без передачи ему всяких объектов?
Да, именно так. Работает только внутри блока catch, при этом исключение распространяется уже за пределы блока, содержащего catch.
1
accept
4823 / 3244 / 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]$
1
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
08.09.2012, 00:34  [ТС] #8
accept, ясно, т.е. можно отказаться от вспомогательной переменной requestSuccess
Но у вас не предусмотрен нормальный выход из цикла. Т.е. если исключения не кидаются, то цикл все равно продолжается
0
08.09.2012, 00:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2012, 00:34
Привет! Вот еще темы с ответами:

Как правильно вызывать исключения? - C++
как правильно вызывать исключения? я вот пишу например так: throw std::exception(&quot;Error!&quot;); исключение то выбрасывается, но сообщение...

Как создавать информативные исключения? - C++
как создавать информативные исключения??? нигде не могу найти внятного объяснения :( единственный способ какой я знаю throw...

Как бросать эти исключения? - C++
throw popOnEmpty();, throw pushOnFull(Value);. Что нибудь надо выше заинкладить/написать? Что именно?

Перебросить исключение из обработчика на уровень GUI - C#
Всем привет. Я бросаю исключение, мне, в обработчике его нужно перебросить выше(делаю throw;), я хочу на уровень GUI, к примеру. ...


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

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

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