Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > тип сгенерированого исключения


Автор: rukudias 18.9.2008, 16:32
Привет Всем!
есть код
Код

void main()
{
  try
    {
        throw ;
    }
    catch(int a)
    {
         a=0;
    }
}


Вопрос какого типа буд сгенерировано исключение!

Автор: vinter 18.9.2008, 16:44
рискну предположить, что никакого. Будет крах и не более.

Автор: rukudias 18.9.2008, 16:54
таки да!
НО почему компилятор не отлавливает эту ситуйовицу?

Автор: vinter 18.9.2008, 17:18
а зачем такое ловить? это потенциально бесполезное действие.. А компилятору лишний гемморой, все таки программы пишут программисты, а не домохозяйки smile

Автор: rukudias 18.9.2008, 17:36
 smile  Я стобой согласен однако сей код буд работать
Код

    try
    {
        try
        {
            throw 10;
        }
        catch(int a)
        {
            cout<<"in"<<endl;
            throw;
        }
    }
    catch(int a)
    {
        cout<<"out"<<endl;
    }

Автор: vinter 18.9.2008, 17:41
rukudias, угу, я даже могу угадать что словит внешний catch smile Наверно 10  smile 
Короче тебе лучше почитать про исключения, throw; в catch это повторная генерация исключения.

Автор: J0ker 18.9.2008, 17:53
не нао бредить господа
есть такое понятие, как стандарт:
15.1
"A throw-expression with no operand rethrows the exception being handled. The exception is reactivated
with the existing temporary; no new temporary exception object is created. The exception is no longer considered to be caught; therefore, the value of uncaught_exception() will again be true."
и далее:
"15.5.1 The terminate() function 
In the following situations exception handling must be abandoned for less subtle error handling techniques:
---------- покатано -------------------
— when a throw-expression with no operand attempts to rethrow an exception and no exception is being
handled (15.1)"

Автор: rukudias 18.9.2008, 18:08
можно на русский

Автор: vinter 18.9.2008, 18:27
Цитата(J0ker @  18.9.2008,  18:53 Найти цитируемый пост)
не нао бредить господа

а где что сказано не так?

Автор: J0ker 18.9.2008, 19:15
если хотите програмить - учите английский
throw без параметров вызывает повторный выброс эксепшена сохраненного во временной переменной без ее пересоздния
если никакого эксцепшена до этого не было, то вызыается функция terminate()
Цитата(vinter @  18.9.2008,  18:27 Найти цитируемый пост)
а где что сказано не так?

здесь
Цитата(vinter @  18.9.2008,  17:18 Найти цитируемый пост)
а зачем такое ловить? это потенциально бесполезное действие.. А компилятору лишний гемморой, все таки программы пишут программисты, а не домохозяйки  

компилятор должен работать по стандарту, а не потому, что "геморрой"

Автор: vinter 18.9.2008, 19:33
J0ker, ну и где там написано, что на это должен реагировать компилятор?
terminate() срабатывает, но эжто время выполнения, а не время компиляции.
З.Ы Компилятор никому ниче не должен, поэтому стандарт полностью не соблюдается нигде(насколько я знаю), так , что уповать на стандарт не стоит.

Автор: rukudias 18.9.2008, 19:58
Респект и уважуха!
 smile 

ЗЫ кинь сцылку на стандарты

Автор: J0ker 18.9.2008, 20:09
Цитата(vinter @ 18.9.2008,  19:33)
J0ker, ну и где там написано, что на это должен реагировать компилятор?
terminate() срабатывает, но эжто время выполнения, а не время компиляции.
З.Ы Компилятор никому ниче не должен, поэтому стандарт полностью не соблюдается нигде(насколько я знаю), так , что уповать на стандарт не стоит.

1. компилятор ни на что не реагирует - он объктный код генерирует
2. обработка исключений (в том числе и вызов terminate()) разрешается на этапе компиляции 
3. компилятор ОБЯЗАН соответствовать cтандарту. Несоответствие стандарту является багом. Компилятор может обрабатывать некоторые расширения, которые не противоречат стандарту. Вы знаете не правильно.

Добавлено через 9 минут и 11 секунд
Цитата(rukudias @ 18.9.2008,  19:58)
ЗЫ кинь сцылку на стандарты

http://www.usatlas.bnl.gov/~dladams/cpp/INCITS+ISO+IEC+14882-2003.pdf

напоминаю, что на подходе новый стандарт:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2705.html

Автор: UnrealMan 18.9.2008, 20:35
Цитата(rukudias @  18.9.2008,  17:54 Найти цитируемый пост)
НО почему компилятор не отлавливает эту ситуйовицу?

Потому что это имело бы смысл только для main.

Код
#include <iostream>

void f()
{
    try
    {
        throw ;
    }
    catch (int a)
    {
         std::cout << a << std::endl;
    }
}

int main()
{
    try
    {
        throw 10;
    }
    catch (...)
    {
        f();
    }
}


Добавлено через 36 секунд
Цитата(J0ker @  18.9.2008,  21:09 Найти цитируемый пост)
2. обработка исключений (в том числе и вызов terminate()) разрешается на этапе компиляции 

smile 

Автор: J0ker 18.9.2008, 20:57
Цитата(UnrealMan @  18.9.2008,  20:35 Найти цитируемый пост)
Потому что это имело бы смысл только для main.

нет, не поэтому
это не ошибка
максимум что разрешается сделать в этом случае компилятору - выкинуть ворнинг

Автор: Alek86 18.9.2008, 22:05
Цитата(UnrealMan @  18.9.2008,  20:35 Найти цитируемый пост)
Потому что это имело бы смысл только для main.

а кто запретит main вызывать в catch блоке?
так что это вообще не имело бы смысла

Автор: vinter 18.9.2008, 22:28
Цитата(J0ker @  18.9.2008,  21:09 Найти цитируемый пост)
2. обработка исключений (в том числе и вызов terminate()) разрешается на этапе компиляции 

жжошь  smile 

Цитата(J0ker @  18.9.2008,  21:09 Найти цитируемый пост)
компилятор ОБЯЗАН соответствовать cтандарту

да никому он ничем не обязан ;)

Добавлено через 1 минуту и 25 секунд
Цитата(J0ker @  18.9.2008,  21:09 Найти цитируемый пост)
Вы знаете не правильно.

ок, назови мне компилятор полностью соответсвующий стандарту, только не лабороторный а реальный.

Автор: J0ker 18.9.2008, 22:50
Цитата(vinter @ 18.9.2008,  22:28)
Цитата(J0ker @  18.9.2008,  21:09 Найти цитируемый пост)
2. обработка исключений (в том числе и вызов terminate()) разрешается на этапе компиляции 

жжошь  smile 

смысл вашего пассажа остался для меня загадкой
Цитата(vinter @ 18.9.2008,  22:28)
Цитата(J0ker @  18.9.2008,  21:09 Найти цитируемый пост)
компилятор ОБЯЗАН соответствовать cтандарту

да никому он ничем не обязан ;)

вы не поняли - это не спор - это факт - я вас просто информирую
Цитата(vinter @ 18.9.2008,  22:28)
Цитата(J0ker @  18.9.2008,  21:09 Найти цитируемый пост)
Вы знаете не правильно.

ок, назови мне компилятор полностью соответсвующий стандарту, только не лабороторный а реальный

любой компилятор заявленный как standard compliant
любые несоответствия стандарту в таком компиляторе являются багами

Автор: MTWizard 18.9.2008, 23:03
Цитата(Alek86 @  18.9.2008,  22:05 Найти цитируемый пост)
а кто запретит main вызывать в catch блоке?

main() по стандарту нельзя вызывать (не помню пункта)

Автор: UnrealMan 19.9.2008, 01:51
Цитата(MTWizard @  19.9.2008,  00:03 Найти цитируемый пост)
main() по стандарту нельзя вызывать (не помню пункта) 

3.6.1 Main function

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)