The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"А как можно из catch вернуть управление"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 22-Фев-05, 19:03  (MSK)
обратно? Ну типа исправил косяк, можно дальше.
  Что-то компилятор матерится, гад
  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "А как можно из catch вернуть управление" 
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 22-Фев-05, 19:07  (MSK)
>обратно? Ну типа исправил косяк, можно дальше.
>  Что-то компилятор матерится, гад

Ты бы код показал.. А управление и так возвращается.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 22-Фев-05, 19:59  (MSK)
>>обратно? Ну типа исправил косяк, можно дальше.
>>  Что-то компилятор матерится, гад
>
>Ты бы код показал.. А управление и так возвращается.


#include <iostream>
#include <string>

using namespace std;

class error {} ;

int
main ()
{
try {
throw error () ;

// а сюда хочу вернуться

cout << "I want here" << endl ;
}
catch ( ... ) {
        // ну чё, goto что ли ?
}

}

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "А как можно из catch вернуть управление" 
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 22-Фев-05, 20:13  (MSK)
Можно и готу, но не надо)
Лучше вынести все в отдельный метод... и вызвать его ещё раз.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "А как можно из catch вернуть управление" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 22-Фев-05, 19:28  (MSK)
>обратно? Ну типа исправил косяк, можно дальше.
>  Что-то компилятор матерится, гад

никак.

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "А как можно из catch вернуть управление" 
Сообщение от SergeiZz Искать по авторуВ закладки on 24-Фев-05, 09:54  (MSK)
>>обратно? Ну типа исправил косяк, можно дальше.
>>  Что-то компилятор матерится, гад
>
>никак.
>
>// wbr
Ибо, если такое дозволяется, это почти ничем не будет отличаться от
использования оператора goto.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 24-Фев-05, 10:21  (MSK)

>Ибо, если такое дозволяется, это почти ничем не будет отличаться от
>использования оператора goto.


Точно нельзя, даже на goto ругается, не компилит.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "А как можно из catch вернуть управление" 
Сообщение от SergeiZz Искать по авторуВ закладки on 24-Фев-05, 11:01  (MSK)
>
>>Ибо, если такое дозволяется, это почти ничем не будет отличаться от
>>использования оператора goto.
>
>
> Точно нельзя, даже на goto ругается, не компилит.
goto работает только в пределах блока, нельзя передать управление в другой
блок. Можно, в принципе, импользовать longjmp(), но это уже скобрёзный
разговор какой-то пошёл...

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 24-Фев-05, 11:09  (MSK)

>блок. Можно, в принципе, импользовать longjmp(), но это уже скобрёзный

Нет, конечно, нужно изменить логику самой программы.

А что такое "скобрёзный" ?

Т.е. я хочу сказать что нехорошо ругаться на бедного старого негра, масса Том, я же на вас не ругался :-)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "А как можно из catch вернуть управление" 
Сообщение от SergeiZz Искать по авторуВ закладки on 24-Фев-05, 11:15  (MSK)
>
>>блок. Можно, в принципе, импользовать longjmp(), но это уже скобрёзный
>
> Нет, конечно, нужно изменить логику самой программы.
>
> А что такое "скобрёзный" ?
>
> Т.е. я хочу сказать что нехорошо ругаться на бедного старого негра,
>масса Том, я же на вас не ругался :-)
Это я в смысле: не хорошо детям показывать картинки для взрослых.
Если задел, ишвиняюсь -- я по роду занятий чешусь от кривых детских ручек
на красных ядерных кнопках.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 24-Фев-05, 12:21  (MSK)

>Если задел, ишвиняюсь -- я по роду занятий чешусь от кривых детских
>ручек
>на красных ядерных кнопках.

Ну не такие уж и детские, дядя Программер
   http://beastie.ru/img/my_animals.jpg

Я этими ручками запросто вот такие вещи строю
   http://coolsoft.ru/floppies/coolbsd.bin

И в отличии от некоторых не прекращаю учиться и новому, и старому - чем заниматься была не судьба.
  http://andr.ru/andr/anketa.html

PS Так что ты не прав, Гнилой Помидор, у индейцев очень красивые имена.

  ;-))

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

21. "А как можно из catch вернуть управление" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 25-Фев-05, 08:50  (MSK)
>>Если задел, ишвиняюсь -- я по роду занятий чешусь от кривых детских
>>ручек
>>на красных ядерных кнопках.
>
> Ну не такие уж и детские, дядя Программер
>   http://beastie.ru/img/my_animals.jpg
>
> Я этими ручками запросто вот такие вещи строю
>   http://coolsoft.ru/floppies/coolbsd.bin

мммм.. мне трудно сказать, что содержится в этих бинарных файлах, но "дизайн" на  www.coolsoft.ru оставляет желать очень много лучшего.. ;)

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

26. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 25-Фев-05, 11:19  (MSK)

>на  www.coolsoft.ru оставляет желать очень много


Этот дизайн был сделан на буке P100/16Mb/HDD512, на которой стоял только Ворд.

Нука-нука, попробуй

:-))

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "А как можно из catch вернуть управление" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 24-Фев-05, 14:11  (MSK)
>
>>Ибо, если такое дозволяется, это почти ничем не будет отличаться от
>>использования оператора goto.
>
>
> Точно нельзя, даже на goto ругается, не компилит.
А как ругается? У меня вот это компилит:

#include <iostream>

using namespace std;

int main () {

try {
throw(1) ;
XXX1:
cout << "I want here if 1" << endl ;
throw(2);
XXX2:
cout << "I want here if 2" << endl ;

}

catch (int  err ) {
switch (err)   {
  case 1: goto XXX1;
  case 2: goto XXX2;
}
}

}


gcc  2.95

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "А как можно из catch вернуть управление" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 24-Фев-05, 15:14  (MSK)
>А как ругается? У меня вот это компилит:
>
>#include <iostream>
>
>using namespace std;
>
>int main () {
>
>try {
> throw(1) ;
>XXX1:
> cout << "I want here if 1" << endl ;
> throw(2);
>XXX2:
> cout << "I want here if 2" << endl ;
>
>}
>
>catch (int  err ) {
> switch (err)   {
>  case 1: goto XXX1;
>  case 2: goto XXX2;
> }
>}
>
>}
>
>
>gcc  2.95

откомпилировать это может быть и можно, только вот работать оно по очевидным причинам не будет :)

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

13. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 24-Фев-05, 15:23  (MSK)
>>А как ругается? У меня вот это компилит:

Не, ругается строго: отсюда делать туда goto нельзя.
У меня FreeBSD 5.3, gcc 3.4.2

Да фигня, я по другому просто поток управления организую, уже не вопрос

Я просто по сишному привык по коду прыгать

Всем спасибо за советы

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

14. "А как можно из catch вернуть управление" 
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 24-Фев-05, 15:25  (MSK)
Прыгать по коду с jmp функциями - это не по сишному, это по придурошному.
Если Вы ещё не пришли к такому мнению - АХТУНГ!
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

27. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 25-Фев-05, 11:22  (MSK)
>Прыгать по коду с jmp функциями - это не по сишному, это
>по придурошному.
>Если Вы ещё не пришли к такому мнению - АХТУНГ!

Зик хайль!

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

15. "А как можно из catch вернуть управление" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 25-Фев-05, 05:10  (MSK)
>>А как ругается? У меня вот это компилит:
>>
>>#include <iostream>
>>
>>using namespace std;
>>
>>int main () {
>>
>>try {
>> throw(1) ;
>>XXX1:
>> cout << "I want here if 1" << endl ;
>> throw(2);
>>XXX2:
>> cout << "I want here if 2" << endl ;
>>
>>}
>>
>>catch (int  err ) {
>> switch (err)   {
>>  case 1: goto XXX1;
>>  case 2: goto XXX2;
>> }
>>}
>>
>>}
>>
>>
>>gcc  2.95
>
>откомпилировать это может быть и можно, только вот работать оно по очевидным
>причинам не будет :)
>
>// wbr


Еще как работает :)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

16. "А как можно из catch вернуть управление" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 25-Фев-05, 07:17  (MSK)
>>откомпилировать это может быть и можно, только вот работать оно по очевидным
>>причинам не будет :)
>>
>>// wbr
>
>
>Еще как работает :)

---cut---
class X;
try {
    X x;
    .....
l1:
    .....
} catch (...) {
    goto l1;
}
---cut---

как вы себе представляете работу указанного кода?

при обработке исключения мы выходим за пределы области видимости блока try/catch -> экземпляр x уничтожается. что произойдёт по переходу goto? заново создастся x? а если это не предусмотрено логикой работы X? или как-то ещё?

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

17. "А как можно из catch вернуть управление" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 25-Фев-05, 07:48  (MSK)
>при обработке исключения мы выходим за пределы области видимости блока try/catch -> экземпляр x уничтожается. что произойдёт по переходу goto? заново создастся x? а если это не предусмотрено логикой работы X? или как-то ещё?

---cut---
#include <iostream>

using namespace std;

class X {
public :
        X() {
                cout << "constructor" << endl;
        };
        ~X() {
                cout << "destructor" << endl;
        };
};

int
main()
{
        try {
                X x;
                cout << "pre-label" << endl;
l1:
                cout << "post-label" << endl;
        } catch (...) {
                cout << "handle exception" << endl;
                goto l1;
        }

        return 0;
}

---cut---

$ g++ --version
g++ (GCC) 3.3.3 (NetBSD nb3 20040520)

$ g++ -Wall test.cc -o xxx
test.cc: In function `int main()':
test.cc:22: error: jump to label `l1'
test.cc:26: error:   from here
test.cc:20: error:   skips initialization of `X x'
test.cc:26: error:   enters try block

..что собссно и следовало ожидать..

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

18. "А как можно из catch вернуть управление" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 25-Фев-05, 08:03  (MSK)
>>>откомпилировать это может быть и можно, только вот работать оно по очевидным
>>>причинам не будет :)
>>>
>>>// wbr
>>
>>
>>Еще как работает :)
>
>---cut---
>class X;
>try {
>    X x;
>    .....
>l1:
>    .....
>} catch (...) {
>    goto l1;
>}
>---cut---
>
>как вы себе представляете работу указанного кода?
>
>при обработке исключения мы выходим за пределы области видимости блока try/catch -> экземпляр x уничтожается. что произойдёт по переходу goto? заново создастся x? а если это не предусмотрено логикой работы X? или как-то ещё?
>
>// wbr


>class X;
>try {
>    X x;
>    .....
>l1:
>    .....
>} catch (...) {
>    goto l1;
>}

Чем что то представлять, лучше найдите gcc 2.95  и откомпильте им следующий код:

#include <iostream>

//take note - no namespace here

int main () {

class X {};

try {
  X x;
  throw(0);
l1:
  cout << "Here me\n";
} catch (...) {
    goto l1;
}
}

Все нормально работает. А на gcc  начиная как минимум с 3.2.x  даже не откомпилится.

Речь не о том правильно это или нет, должно оно сработать или нет, а о том, что если КОНКРЕТНО указанный код откомилить gcc 2.95 (возможно и gcc 3.0) то будет оно работать - только факт и ничего более.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

19. "А как можно из catch вернуть управление" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 25-Фев-05, 08:24  (MSK)
>Чем что то представлять, лучше найдите gcc 2.95  и откомпильте им
>следующий код:

давайте еще антиквариат навроде watcom 9 вспомним,  там вообще все плющаво ;)

>#include <iostream>
>
>//take note - no namespace here

таки нет. или вы указываете std:: явным образом [не указываете] или глобально через using.

ps: другой вопрос, что не все C++ компиляторы поддерживают пространства имен :) пример - Watcom C++ 9/10x. или кривый libc++ с глобальным пространством std. оба идут вопреки стандарту.

>int main () {
>
>class X {};
>
> try {
>  X x;
>  throw(0);
>l1:
>  cout << "Here me\n";
> } catch (...) {
>    goto l1;
> }
>}
>
>Все нормально работает.

на основании чего вы сделали вывод, что это нормально работает?
в смысле запускается и не валится в core? это еще не показатель нормальной работы :) обратитесь к x после метки..

> А на gcc  начиная как минимум с 3.2.x
> даже не откомпилится.

ugu, см. выще

>Речь не о том правильно это или нет, должно оно сработать или
>нет, а о том, что если КОНКРЕТНО указанный код откомилить gcc
>2.95 (возможно и gcc 3.0) то будет оно работать - только
>факт и ничего более.

с таким "тестированием" у вас на 99% и код с выходом за границы массива будет "нормально" работать :) ну в смысле не будет валиться. точнее, валиться будет, но редко..

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

22. "А как можно из catch вернуть управление" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 25-Фев-05, 09:20  (MSK)
>давайте еще антиквариат навроде watcom 9 вспомним,  там вообще все плющаво
>;)

Да ничего я не собираюсь вспоминать. Еще раз повторю - просто привел факт, что на 2.95 оно откомилируется и  будет работает.

>
>>#include <iostream>
>>
>>//take note - no namespace here
>
>таки нет. или вы указываете std:: явным образом [не указываете] или глобально
>через using.

Хотел просто сказать, что gcc >= 3.2  в этом случае выдаст ошибку, и ничего более :)

>
>ps: другой вопрос, что не все C++ компиляторы поддерживают пространства имен :)
>пример - Watcom C++ 9/10x. или кривый libc++ с глобальным пространством
>std. оба идут вопреки стандарту.
>
>>int main () {
>>
>>class X {};
>>
>> try {
>>  X x;
>>  throw(0);
>>l1:
>>  cout << "Here me\n";
>> } catch (...) {
>>    goto l1;
>> }
>>}
>>
>>Все нормально работает.
>
>на основании чего вы сделали вывод, что это нормально работает?
>в смысле запускается и не валится в core? это еще не показатель
>нормальной работы :) обратитесь к x после метки..
>

Работает так, как должно работать - правильно или нет, это уже другой вопрос

>> А на gcc  начиная как минимум с 3.2.x
>> даже не откомпилится.
>
>ugu, см. выще
>
>>Речь не о том правильно это или нет, должно оно сработать или
>>нет, а о том, что если КОНКРЕТНО указанный код откомилить gcc
>>2.95 (возможно и gcc 3.0) то будет оно работать - только
>>факт и ничего более.
>
>с таким "тестированием" у вас на 99% и код с выходом за
>границы массива будет "нормально" работать :) ну в смысле не будет
>валиться. точнее, валиться будет, но редко..
>
>// wbr


Какой вы нудный однако :))) Ну прежде всего, я так try/catch никогда не использую (мне даже в голову такое не приходило - использовать goto), но уж коль я сделал goto на метку в другом блоке, то я уж позабочусь, чтоб все было нормально. ПОДЧЕРКИВАЮ - я БЫ так никогда БЫ не сделал, но если БЫ возникла БЫ такая задача, то реализовать это с gcc 2.95  вполне возможно - и это просто ФАКТ И НИЧЕГО БОЛЕЕ.


P.S. Не надо мне больше объяснять, что дважды два четыре, please. ;-) Все что я хотел сказать, это то, что тот код откомпилируется и будет работать если использовать gcc 2.95  И НИЧЕГО БОЛЕЕ

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

23. "А как можно из catch вернуть управление" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 25-Фев-05, 09:32  (MSK)
>Какой вы нудный однако :))) Ну прежде всего, я так try/catch никогда
>не использую (мне даже в голову такое не приходило - использовать
>goto), но уж коль я сделал goto на метку в другом
>блоке, то я уж позабочусь, чтоб все было нормально. ПОДЧЕРКИВАЮ -
>я БЫ так никогда БЫ не сделал, но если БЫ возникла
>БЫ такая задача, то реализовать это с gcc 2.95  вполне
>возможно - и это просто ФАКТ И НИЧЕГО БОЛЕЕ.
>
>
>P.S. Не надо мне больше объяснять, что дважды два четыре, please. ;-)
>Все что я хотел сказать, это то, что тот код откомпилируется
>и будет работать если использовать gcc 2.95  И НИЧЕГО БОЛЕЕ

у нас видимо различные взгляды на термин "работает" :)

ps: к сожалению, я не могу так просто проверить "работоспособность" этой плюшки бо все доступные C++ компиляторы (gcc3.x, watcom 10.6, openwatcom 1.3) отказываются это даже собирать, а 2.95.3 слава богу уже практически канул в лета.

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

24. "А как можно из catch вернуть управление" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 25-Фев-05, 09:45  (MSK)
>у нас видимо различные взгляды на термин "работает" :)
А задайте мне задачку с try/catch/goto (только чур без особых извратов), думаю я ее релизую на gcc 2.95 и будет работать как надо :)

>
>ps: к сожалению, я не могу так просто проверить "работоспособность" этой плюшки
>бо все доступные C++ компиляторы (gcc3.x, watcom 10.6, openwatcom 1.3) отказываются
>это даже собирать, а 2.95.3 слава богу уже практически канул в
>лета.
>
>// wbr

Ну может тогда мне на слово поверите? Потому как я сначала проверил и только потом запостил.
gcc -v
gcc version 2.95.4 20011002 (Debian prerelease)
Если есть VMWare,  то можно на виртулаьную машину посадить какой-нибудь старый(но не очень) дистр FreeBSD или Linux - занимает минут 15-20.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

25. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 25-Фев-05, 11:17  (MSK)

Господа!
Проблема решается очень просто!
Вместо 1 блока try надо сделать два

Вот исправленный вариант ранее заявленой проги

#include <iostream>
#include <string>

using namespace std;

class error {} ;

int
main ()
{
try {
throw error () ;
}
catch ( ... ) {
// исправили кривизну
}

try {
// а сюда попали как хотели

cout << "I want here" << endl ;
}
catch ( ... ) {

}

}
===============================

Спорить не о чем, всё в шоколаде

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

28. "А как можно из catch вернуть управление" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 25-Фев-05, 11:40  (MSK)
> Спорить не о чем, всё в шоколаде
Эхехе... Да спор то (если это можно назвать спором) совсем не о том ;-)


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

29. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 25-Фев-05, 11:43  (MSK)
>> Спорить не о чем, всё в шоколаде
>Эхехе... Да спор то (если это можно назвать спором) совсем не о
>том ;-)

Тогда откройте другой топик, плз. А то мне ваш спор летит на мыло.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

30. "А как можно из catch вернуть управление" 
Сообщение от SergeiZz Искать по авторуВ закладки on 28-Фев-05, 14:42  (MSK)
> Господа!
> Проблема решается очень просто!
> Вместо 1 блока try надо сделать два
>
> Вот исправленный вариант ранее заявленой проги
>
>#include <iostream>
>#include <string>
>
>using namespace std;
>
>class error {} ;
>
>int
>main ()
>{
>try {
>  throw error () ;
>}
>catch ( ... ) {
> // исправили кривизну
>}
>
>try {
>  // а сюда попали как хотели
>
>  cout << "I want here" << endl ;
>}
>catch ( ... ) {
>
>}
>
>}
>===============================
>
> Спорить не о чем, всё в шоколаде
Ха! Если б всё так было просто.
Так нарушается едвали не главный принцип использования исключений: не
использовать их как управляющую конструкцию.
throw должен выбрасывать почти только ошибки, после которых действительно
нельзя продолжить. Вся идея try--catch в том, что деструкторы вызовутся
окуратненько, освободив все занятые ресурсы -- и только то.
А здесь именно управляющая конструкция.
Ветхий это код, батенька, -- в утиль его.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

31. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 28-Фев-05, 15:08  (MSK)
>Ха! Если б всё так было просто.
>Так нарушается едвали не главный принцип использования исключений: не
>использовать их как управляющую конструкцию.

  Не порите чушь, где вы видели "основную идею try-catch" ? Сошлитесь пжлста на авторитет, было бы удобно на стр. специального издания Страуструпа издательства БИНОМ 2004г, у меня оно.

  Не знаю какая у разработчика была основная идея, а какая запасная, но try-catch - это именно управляющая конструкция и ничего более. Я бы сказал больше - очень удобная управляющая конструкция

>Ветхий это код, батенька, -- в утиль его.


Ну как хотите, у меня замечательно работает.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

32. "А как можно из catch вернуть управление" 
Сообщение от SergeiZz Искать по авторуВ закладки on 28-Фев-05, 15:35  (MSK)
>>Ха! Если б всё так было просто.
>>Так нарушается едвали не главный принцип использования исключений: не
>>использовать их как управляющую конструкцию.
>
>  Не порите чушь, где вы видели "основную идею try-catch" ?
>Сошлитесь пжлста на авторитет, было бы удобно на стр. специального издания
>Страуструпа издательства БИНОМ 2004г, у меня оно.
Это лучше всего изложено, помоему, у И.Пол.

>  Не знаю какая у разработчика была основная идея, а какая
>запасная, но try-catch - это именно управляющая конструкция и ничего более.
>Я бы сказал больше - очень удобная управляющая конструкция
Судя по всему, BASIC Вам больше подходит, чем C++.

>>Ветхий это код, батенька, -- в утиль его.
> Ну как хотите, у меня замечательно работает.
Так и ладненько же. Только не показывайте никому, или не обижайтесь, когда
те, кто будут это читать ржать будут.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

33. "А как можно из catch вернуть управление" 
Сообщение от Lamr emailИскать по авторуВ закладки on 28-Фев-05, 16:09  (MSK)
>Судя по всему, BASIC Вам больше подходит, чем C++.

Дык в БАСИК try-catch как раз и нету! Это он вам больше подходит, раз вы его не хотите использовать.

>Так и ладненько же. Только не показывайте никому,


Ладно, никому не покажу, сам юзать буду

>те, кто будут это читать ржать будут.

Топчите, драконьте, пингвинологи проклятые, виндоюзеры убогие, всё равно правда восторжествует и воцариться везде BSD-дъявол, аминь

Ну по другому напишу, если так не выйдет, всё равно напишу. От вас помощи, как от козла удой.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

34. "А как можно из catch вернуть управление" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 02-Мрт-05, 08:55  (MSK)
>>Судя по всему, BASIC Вам больше подходит, чем C++.
>
> Дык в БАСИК try-catch как раз и нету! Это он вам
>больше подходит, раз вы его не хотите использовать.
>
>>Так и ладненько же. Только не показывайте никому,
>
>
> Ладно, никому не покажу, сам юзать буду
>
>>те, кто будут это читать ржать будут.
>
> Топчите, драконьте, пингвинологи проклятые, виндоюзеры убогие, всё равно правда восторжествует и
>воцариться везде BSD-дъявол, аминь
>
> Ну по другому напишу, если так не выйдет, всё равно напишу.
>От вас помощи, как от козла удой.


Sorry, что опять влезаю. Мне кажется, что вы неэффективно используете try/catch и в  вашем случае просто можно было обойтись конструкцией if else. Ниже упрощенный пример как я использую try/catch (Возможно меня сейчас тоже облажают с ног до головы :))

#include <iostream>
#include <stdio.h>
#include <errno.h>
#include <string.h>

using namespace std;

class Error {
public:
Error(int acode, char * msg) {code=acode; strncpy(message,msg,sizeof(message)-1);}
void report(char *fname) {printf("Got error whil opening file '%s': %s (code=%i)\n",fname,message,code);}
int code;
char message[256];
};

void fileopen(char *fname) {
FILE *f;
if (!fname) throw(Error(1000,"NULL name passed"));
if (!fname[0]) throw(Error(1001,"Zero length name passed"));
if (fname[0]<=32) throw(Error(1002,"Illegal first character in name"));
f=fopen(fname,"r");
if (errno) throw Error(errno,strerror(errno));
fclose(f);
}


int main() {
char fname[100];

cout <<  "Enter fname: ";
cin.getline(fname,sizeof(fname)-1);

try {
  fileopen(fname);
  printf("File '%s' succesfully open and closed\n",fname);
}
catch (Error e) {
  e.report(fname);
}

return 0;
}

Здесь если использовать, if else, код, на мой взгляд, заметно осложниться.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

20. "А как можно из catch вернуть управление" 
Сообщение от klalafuda emailИскать по авторуВ закладки on 25-Фев-05, 08:41  (MSK)
>Все нормально работает. А на gcc  начиная как минимум с 3.2.x
> даже не откомпилится.
>
>Речь не о том правильно это или нет, должно оно сработать или
>нет, а о том, что если КОНКРЕТНО указанный код откомилить gcc
>2.95 (возможно и gcc 3.0) то будет оно работать - только
>факт и ничего более.

собссно, что спорить, в стандарте на C++ явно сказано:

---cut---
INTERNATIONAL STANDARD ISO/IEC 14882
First edition 1998-09-01

6.1 Labeled statement [stmt.label]
1 A statement can be labeled.

labeled-statement:
  identifier : statement
  case constant-expression : statement
  default : statement

An identifier label declares the identifier. The only use of an identifier label is as the target of a goto. The scope of a label is the function in which it appears. Labels shall not be redeclared within a function. A label can be used in a goto statement before its definition. Labels have their own name space and do not interfere with other identifiers.

2 Case labels and default labels shall occur only in switch statements.

.........

6.6.4 The goto statement [stmt.goto]

1 The goto statement unconditionally transfers control to the statement labeled by the identifier. The identifier shall be a label (6.1) located in the current function.
---cut---

ps: то, что это взято из достаточно старенького драфта, сути дела не меняет.

// wbr

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру