На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> Исключения С++,С и SEH-исключения
    Возникли некоторые непонятки. Вот прочитал главу Рихтера об исключениях. Он пишет, что исключения С++ раскрываются компилятором в SEH-исключения с дополнительной проверкой типа аргумента в блоке catch. Логично предположить что условие catch(...) будет отличаться от __except только тем, что не будет возможности продолжать выполнение программы (значение фильтра исключения EXCEPTION_CONTINUE_EXECUTION).

    Есть ключ компилятора /EH (Exception Handling Model):
    a - The exception-handling model that catches asynchronous (structured) and synchronous (C++) exceptions.
    s - The exception-handling model that catches C++ exceptions only and tells the compiler to assume that extern C functions do throw an exception.
    c - If used with s (/EHsc), catches C++ exceptions only and tells the compiler to assume that extern C functions never throw a C++ exception. /EHca is equivalent to /EHa.


    Если ключ компилятора /EH не задан, то по умолчанию:
    If /EH is not specified, the compiler will catch structured and C++ exceptions, but will not destroy C++ objects that will go out of scope as a result of the exception.

    Собственно вопросы:
    1) В чём различие между С-программой и C++-программой в плане обработки исключений?
    Как вообще отличить С-программу от С++? Только по списку функций и соответственно по типу используемых библиотек или ещё как-то?

    2) Фраза "but will not destroy C++ objects that will go out of scope as a result of the exception" означает что при возникновении С++ исключения по умолчанию не будут вызваны деструткоры для всех локальных объектов?

    3) В чём отличие ключа /EHa от отсутствия ключа /EH в принципе? Может в том что будут вызываться деструкторы для С++ исключений?
    Сообщение отредактировано: neokoder -
      Цитата
      1) В чём различие между С-программой и C++-программой в плане обработки исключений?

      в Си как мне помнится нету обработки исключений, только в С++

      Цитата
      Как вообще отличить С-программу от С++?

      По использованию кода С++

      Цитата
      2) Фраза "but will not destroy C++ objects that will go out of scope as a result of the exception" означает что при возникновении С++ исключения по умолчанию не будут вызваны деструткоры для всех локальных объектов?

      да

      Тока в итоге не понятно что тебя интересует С++ исключения или SEH
        Цитата Dem_max @
        в Си как мне помнится нету обработки исключений, только в С++

        Ну __try/__except,__try/__finally(т.е. SEH исключения) по-любому можно использовать на с-программе. И это всё же будет ещё С-программа.

        То есть вы хотите сказать если я использую операторы try, catch, то это уже автоматически C++-программа. Да?


        Вообще, меня интересует как наилучшим образом обрабатывать исключения в программе, которая долждна работать 24х7.
        Микрософты рекомендуют использовать Try-Catch в С++ программе:
        Цитата MSDN
        The Win32 structured exception-handling mechanism works with both C and C++ source files. However, it is not specifically designed for C++. You can ensure that your code is more portable by using C++ exception handling. Also, C++ exception handling is more flexible, in that it can handle exceptions of any type. For C++ programs, it is recommended that you use the C++ exception-handling mechanism (try, catch, throw) described in this topic.

        Получается лучше использовать конструкции try/catch с опцией /EHa. Но единственный вопрос: будут ли вызваны деструкторы при С++-исключении?
        Сообщение отредактировано: neokoder -
          кстати нашел на мелкософтах
          Цитата
          Microsoft C++ now supports the C++ exception handling model, based on the ANSI C++ Standard. This mechanism automatically handles destruction of local objects during stack unwind. If you are writing fault-tolerant C++ code, and you want to implement exception handling, it is strongly recommended that you use C++ exception handling, rather than structured exception handling. (Note that while the C++ compiler supports structured exception handling constructs as described in these articles, the standard C compiler does not support the C++ exception handling syntax.) For detailed information about C++ exception handling, see C++ Exception Handling and the Annotated C++ Reference Manual by Margaret Ellis and Bjarne Stroustrup.

          ссылка http://msdn.microsoft.com/en-us/library/7w0chfbk(v=vs.80).aspx

          ну еще http://msdn.microsoft.com/en-us/library/swezty51(v=vs.80).aspx
            Цитата neokoder @
            И это всё же будет ещё С-программа.
            Это будет уже не ANSI/ISO C
              интересно почему не ловится такое исключение
              ExpandedWrap disabled
                  try
                  {
                        int x,y,z;
                        x = 1;
                        y = 0;
                        z = x/y;
                  }
                  catch(...)
                  {
                  
                  }
                Цитата Dem_max @
                This mechanism automatically handles destruction of local objects during stack unwind.

                Получается, что скорее всего с любой заданной опцией /EH будут вызываться деструкторы. А если /EH не указано, то не будут. Думаю так.

                Добавлено
                Цитата Dem_max @
                интересно почему не ловится такое исключение

                Деление на ноль - это SEH-исключение. А опция компилятора по умолчанию /EHsс. Поставь /EHa и будет ловиться.
                  Цитата
                  Деление на ноль - это SEH-исключение.

                  SEH тоже не ловится

                  разными исключениями ловится только если
                  ExpandedWrap disabled
                            float x,y,z;
                            x = 1.0;
                            y = 0.0;
                            z = x/y;
                    Цитата Dem_max @
                    SEH тоже не ловится
                    разными исключениями ловится только если


                    Dem_max, надо в диалоговом окне Exceptions, в разделе Win32 Exceptions поставить галку напротив "Integer division by zero".

                    Вообще это странно почему они не включены по умолчанию!

                    Добавлено
                    Блин а для Release-версии всё рано не ловятся, только для Debug! :-? Ну и как же их ловить тогда в Release-версии?
                    Сообщение отредактировано: neokoder -
                      Отключил оптимизацию, всё заработало для Release-Версии. Что ж это получается если хочешь обрабатыватть исключения в конечной(release) программе, забудь про оптимизацию?
                        Цитата neokoder @
                        Отключил оптимизацию, всё заработало для Release-Версии. Что ж это получается если хочешь обрабатыватть исключения в конечной(release) программе, забудь про оптимизацию?

                        Да нет, всё там ловится.
                        Оптимизатор просто выбрасывает эти совершенно бессмысленные строки.
                        Сделай так, и всё получится:
                        ExpandedWrap disabled
                                       int x,y,z=0;
                                  try
                                  {
                           
                                        x = 1;
                                        y = 0;
                                        z = x/y;
                                  }
                                  catch(...)
                                  {
                           _tprintf(__TEXT("catch \r\n"));      
                                  }
                           
                           _tprintf(__TEXT("z=%d\r\n"),z);
                          вынос int x,y,z=0; за try не помогает
                          ExpandedWrap disabled
                              int x,y,z = 0;
                              try
                              {
                                    x = 1;
                                    y = 0;
                                    printf("X= %i", x);
                                    z = x/y;
                              }
                              catch(...)
                              {
                                    puts("Exeption in try");
                              }
                            Цитата Dem_max @
                            вынос int x,y,z=0; за try не помогает

                            Подумай, что именно ты сделал ?
                            Зачем выносить x,y,z за try ?

                            Текст, который я показал, я откомпилировал.
                            Программа работает как надо.
                            При компиляции выдаётся предупреждение:
                            Цитата

                            warning C4723: potential divide by 0

                            А у тебя ?
                              Цитата
                              А у тебя ?

                              а у меня никакого варнинга
                                Цитата neokoder @
                                3) В чём отличие ключа /EHa от отсутствия ключа /EH в принципе?
                                Когда-то уже много писал по подобному поводу. Где-то вот отсюда и там ниже на страничке.
                                Цитата Dem_max @
                                SEH тоже не ловится
                                С -EHa ловится везде. У тебя z не используется, поэтому компилятор наверняка выкинул код её вычисления. Добавь volatile хотя бы.
                                Сообщение отредактировано: Qraizer -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0413 ]   [ 15 queries used ]   [ Generated: 18.07.25, 00:03 GMT ]