На главную Наши проекты:
Журнал   ·   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.
Страницы: (10) « Первая ... 3 4 [5] 6 7 ...  9 10 все  ( Перейти к последнему сообщению )  
> необходимо разобраться с обработкой системных исключений , (что писать сюда: catch (...))? компилятор g++
    Цитата cppasm @
    UnhandledExceptionFilter НЕ ЛОВИТ ИСКЛЮЧЕНИЯ ЯЗЫКА, она ловит только системные исключения.

    Он ловит ВСЕ исключения и SEH и C++.

    Добавлено
    Цитата niXman @
    Qraizer, покажи код который как-то ни так работает на мингве, и "так" на "правильном" компиляторе. чтоб было о чем с девелоперами общаться.

    Пожалуйста тебе:

    ExpandedWrap disabled
      #include <windows.h>
      #include <stdio.h>
      #include <tchar.h>
      #include <conio.h>
       
      int z,p=1,d=0;
       
      LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS except_info)
      {
        printf ("Поймали исключение. Код 0x%X.\n",except_info->ExceptionRecord->ExceptionCode);
        return EXCEPTION_EXECUTE_HANDLER;
      }
       
      int _tmain(int argc, _TCHAR* argv[])
      {
        
        SetConsoleCP (1251);
        SetConsoleOutputCP (1251);
       
        SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter);
        
        //SEH, деление на ноль
        z=p/d;
       
        //сюда можно будет попасть только с использованием __except
        printf("Нажмите любую клавишу...\n");
        _getch();
        return 0;
      }


    niXman, ты думаешь по твоим просьбам разработчики GCC вот так вот разбегутся и сразу прям реализуют поддержку SEH на Windows? :)
    GCC изначально разрабатывался для Unix-Linux, MSVC естественно для Windows родной. Поэтому есть золотое правило: в Unix-Linux используй GCC, в Windows использую MSVC. И не будет никаких заморочек! :victory:
    Сообщение отредактировано: neokoder -
      Цитата neokoder @
      ты думаешь по твоим просьбам разработчики GCC вот так вот разбегутся и сразу прям реализуют поддержку SEH на Windows?

      нет. цель не в этом. просто я полагал, что в этом примере нет SEH...

      Добавлено
      при том, вот что выводит твой пример:
      Цитата

      C:\test>except
      In TopLevelUnhandledExceptionFilter.
      Catched exception with code 0xC0000094.

      покажи что он должен выводить.

      Добавлено
      т.е. проблема в том, что не выводит это?: printf("Нажмите любую клавишу...\n");
      Сообщение отредактировано: niXman -
        Цитата neokoder @
        Цитата cppasm @
        UnhandledExceptionFilter НЕ ЛОВИТ ИСКЛЮЧЕНИЯ ЯЗЫКА, она ловит только системные исключения.

        Он ловит ВСЕ исключения и SEH и C++.

        Тебе самому не надоело одно по одному гонять? В сообщении номер 5 я тебе сказал и показал, как именно она не ловит C++ исключения. Потом мы выяснили, что она ловит C++ исключения если исползуется MSVS, вот твоё сообщение номер 12:
        Цитата
        В MSVS всё будет работать. Я думал может и в твоём компиляторе по аналогии заработает.

        И щас ты снова безапелляционно, без всяких оговорок на компилятор заявляешь, что заявляешь. Не стыдно? Неплохое начало холивара.
        Сообщение отредактировано: повстанец -
          Цитата niXman @
          при том, вот что выводит твой пример:

          Естественно в MSVC он это и должен выводить.

          Речь идёт о GCC. GCC(Cygwin) у меня выводит следующее:
          ExpandedWrap disabled
                  0 [main] seh 4292 exception::handle: Exception: STATUS_INTEGER_DIVIDE_BY_Z
            ERO
               2167 [main] seh 4292 open_stackdumpfile: Dumping stack trace to seh.exe.stack
            dump


          Цитата niXman @
          т.е. проблема в том, что не выводит это?: printf("Нажмите любую клавишу...\n");

          Он и не должен выводить. Посмотри я подправил код. Будет выводить только при использовании __try, __except, а ТоpUnhandledExceptionFilter это последний код который выполнит программа если он возвращает EXCEPTION_EXECUTE_HANDLER. Так что все правильно.

          Слуiай, а ты не в MinGW компилил пример? Может это только у Cygwin нет поддержки работоспособной SetUnhandledExceptionFilter?
          Сообщение отредактировано: neokoder -
            Цитата neokoder @
            Естественно в MSVC он это и должен выводить.

            ок :yes:
            Цитата neokoder @
            Речь идёт о GCC.

            я в курсе :yes:
            Цитата neokoder @
            у меня выводит следующее:

            я хз чем ты тестишь. но самое интересное в том, что приведенный вывод я получил использовав свои сборки MinGW. никакого MSVC.

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

            Добавлено
            и да, сейчас я установлю экспресс студию, что умельцы мне моцг не парили. а то прям чудеса какие-то творятся...
            Сообщение отредактировано: niXman -
              повстанец, не поднимай пыть, ладно? Я говорил о том что в MSVC UnhandledExceptionFilter ловит ВСЕ исключения и SEH и C++. А то что там всякие неполноценные реализации GCC для Windows не работают как надо это меня мало интересует. Эт ты фанат :) , вместо того чтобы просто воспользоваться MSVC ты занимаешь садомазохизмом! :)
                только что еще и доку по SetUnhandledExceptionFilter() прочел. код собранный MinGW`ом работает как и должен.
                  Цитата niXman @
                  но самое интересное в том, что приведенный вывод я получил использовав свои сборки MinGW.

                  Ну вот значит это косяки Cygwin. Значит будем считать, что SetUnhandledExceptionFilter отлично пашет в MinGW.

                  А что насчёт __try __except поддерживается этот синтаксис в MinGW? И скажи какой версией GCC компилишь? И MinGW какая версия? Сейчас поставлю, посмотрю сам ради интереса.

                  Добавлено
                  niXman, в общем такой код скомпилится в MinGW?

                  ExpandedWrap disabled
                    #include <windows.h>
                    #include <stdio.h>
                     
                     
                     
                    int z,p=1,d=0;
                     
                    LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS except_info)
                    {
                      printf ("Поймали исключение. Код 0x%X.\n",except_info->ExceptionRecord->ExceptionCode);
                      return EXCEPTION_EXECUTE_HANDLER;
                      
                    }
                      
                     
                    int main()
                    {
                      
                      SetConsoleCP (1251);
                      SetConsoleOutputCP (1251);
                     
                     
                      SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter);
                     
                      __try
                      {
                         //SEH, деление на ноль
                         z=p/d;
                        
                         //исключение bad:alloc (С++ исключение)
                         //__int64 *pI = new __int64[0xFFFFFFF];
                     
                      }
                      __except(EXCEPTION_EXECUTE_HANDLER)
                      {
                         printf("Попали в __except\n");
                      }
                     
                      
                      printf("Программа завершила свою работу. Нажмите любую клавишу...\n");
                      getchar();
                      return 0;
                    }
                  Сообщение отредактировано: neokoder -
                    Цитата neokoder @
                    повстанец, не поднимай пыть, ладно? Я говорил о том что в MSVC UnhandledExceptionFilter ловит ВСЕ исключения и SEH и C++.

                    Лгун. Я один тут не вижу слова MSVC?
                    Цитата
                    UnhandledExceptionFilter НЕ ЛОВИТ ИСКЛЮЧЕНИЯ ЯЗЫКА, она ловит только системные исключения.
                    Цитата
                    Он ловит ВСЕ исключения и SEH и C++.
                    сообщение номер 64
                    Сообщение отредактировано: повстанец -
                      Цитата neokoder @
                      Ну вот значит это косяки Cygwin.

                      ну дык! сижвин и не должен это обрабатывать! он же эмулятор! :wall:

                      Цитата neokoder @
                      А что насчёт __try __except поддерживается этот синтаксис в MinGW?

                      микрософткомпилятор славится своим не соответствием стандарту. ты что считаешь, что его несоответствия должны перенести в стандарт? :D
                      ни один компилятор в здравом уме не станет реализовывать __try __except. засмеют же.

                      Цитата neokoder @
                      И скажи какой версией GCC компилишь? И MinGW какая версия?

                      у меня в пописи. 4.6.1/4.6.2/4.7.0
                        Цитата повстанец @
                        Я один тут не вижу слова MSVC?

                        Специально для тебя:
                        Цитата cppasm @
                        UnhandledExceptionFilter НЕ ЛОВИТ ИСКЛЮЧЕНИЯ ЯЗЫКА, она ловит только системные исключения.

                        Он ловит ВСЕ исключения и SEH и C++ в MSVC.

                        И ещё вот это также специально для тебя :) :
                        Цитата cppasm @
                        Бажит повстанец, потому что не читает ни MSDN, ни то, что ему пишут (тему правда уже почикали).
                          :good: neokoder, всегда так делай
                            код скомпиленный в msvc2010-express работает так же. значит вопрос закрыт.
                              Цитата niXman @
                              микрософткомпилятор славится своим не соответствием стандарту. ты что считаешь, что его несоответствия должны перенести в стандарт?
                              ни один компилятор в здравом уме не станет реализовывать __try __except. засмеют же.

                              Ну хорошо, давай в стандартном варианте. Вот такой код будет работать правильно в MinGW:


                              ExpandedWrap disabled
                                #include <windows.h>
                                #include <stdio.h>
                                 
                                 
                                 
                                int z,p=1,d=0;
                                 
                                LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS except_info)
                                {
                                  printf ("Поймали исключение. Код 0x%X.\n",except_info->ExceptionRecord->ExceptionCode);
                                  return EXCEPTION_EXECUTE_HANDLER;
                                  
                                }
                                  
                                 
                                int main()
                                {
                                  
                                  SetConsoleCP (1251);
                                  SetConsoleOutputCP (1251);
                                 
                                 
                                  SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter);
                                 
                                  try
                                  {
                                     //SEH, деление на ноль
                                     z=p/d;
                                  }
                                  catch(...)
                                  {
                                     printf("Попали в catch\n");
                                  }
                                 
                                  
                                  //исключение bad:alloc (С++ исключение)
                                    //__int64 *pI = new __int64[0xFFFFFFF];
                                 
                                  printf("Программа завершила свою работу. Нажмите любую клавишу...\n");
                                  getchar();
                                  return 0;
                                }


                              В MSVC получаем(компилируя c /EHa):
                              ExpandedWrap disabled
                                Попали в catch
                                Программа завершила свою работу. Нажмите любую клавишу...


                              Добавлено
                              Цитата niXman @
                              код скомпиленный в msvc2010-express работает так же. значит вопрос закрыт.

                              Ёпти, ты думаешь я не проверяю что ли прежде чем выкладывать код? Если я даю код значит я его проверил в MSVC. Так что не зачем тебе было проверять в MSVC++.
                              Ты лучше последний примерчик скомпиляй плиз в своём MinGW. Какой будет результат? А то я тут пока скачаю, пока поставлю...
                              Сообщение отредактировано: neokoder -
                                Цитата neokoder @
                                давай в стандартном варианте

                                ты походу троллишь, да? какой же это стандартный вариант? ;)
                                стандартным, будет выбросить throw из try{} блока.

                                выводит это:
                                Цитата

                                C:\test>cl except.cpp
                                Microsoft ® 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
                                Copyright © Microsoft Corporation. All rights reserved.

                                except.cpp
                                except.cpp(26) : warning C4530: C++ exception handler used, but unwind semantics
                                are not enabled. Specify /EHsc
                                Microsoft ® Incremental Linker Version 10.00.30319.01
                                Copyright © Microsoft Corporation. All rights reserved.

                                /out:except.exe
                                except.obj

                                C:\test>except
                                Попали в __except
                                Программа завершила свою работу. Нажмите любую клавишу...


                                C:\test>g++ except.cpp -oexcept

                                C:\test>except
                                Поймали исключение. Код 0xC0000094.

                                C:\test>


                                Добавлено
                                neokoder, еще, способы убедить всех в том что микрософт-специфик расширения являются стандартом, будут? :D
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (10) « Первая ... 3 4 [5] 6 7 ...  9 10 все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0551 ]   [ 15 queries used ]   [ Generated: 12.10.25, 01:56 GMT ]