На главную Наши проекты:
Журнал   ·   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) 1 [2] 3 4 ...  9 10 все  ( Перейти к последнему сообщению )  
> необходимо разобраться с обработкой системных исключений , (что писать сюда: catch (...))? компилятор g++
    Цитата повстанец @
    Не беспокойся, в общем, больше. До свидания. Желаю счастья.

    Ну раз так, то счастливо. :) На фига тогда вопрос задаешь если не хочешь слышать ответы? Cтранно! :)

    Добавлено
    Цитата повстанец @
    Вот отрывок из кода из первого сообщения, я проверил

    Ну и где здесь catch(...)???
      в g++ таких опций нет, есть - fexceptions, она включена по умолчанию

      Добавлено
      Просто ты не можешь мне помочь. Ты пытался, но больше не можешь.
      А чё, троеточие нужно было ставить?
      Ну короче, с троеточием тоже не работает. Но даже если бы и работало, как мне исключения-то различать меж собой? Никак.
        повстанец, SEH - это часть интерфейса WinAPI, предоставляемый ОС. Для эффективного его использования C и C++ компиляторы MS поддерживают расширение синтаксиса в лице __try/__except/__finally/__leave. Для других языков или других компиляторов эффективное использование SEH становится проблемой других языков или компиляторов. Компиляторы Intel C++ и Borland имеют таковую. Почему её не имеет порт gcc/g++ под Win, хороший вопрос их авторам.
        Для пользователей языков или компиляторов, не имеющих эффективной поддержки SEH, WinAPI предоставляет иные средства, например в лице SetUnhandledExceptionFilter(). Попробуй такой пример:
        ExpandedWrap disabled
          #include <windows.h>
          #include <stdio.h>
           
          void k ()
          {
            printf ("hello, word!\n");
            k();
          }
           
           
          LONG WINAPI TopLevelUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* except_info)
          {
            throw except_info;
          }
           
          int main ()
          {
           SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter);
           
           try
           {
            k();
           }
           catch (PEXCEPTION_POINTERS except_info)
           {
            if (except_info->ExceptionRecord->ExceptionCode == EXCEPTION_STACK_OVERFLOW)
             printf ("Stack overflow exception\n");
            else printf ("Unexpected exception!\n");
           }
           
           return 0;
          }


        Добавлено
        Вообще, Стандарт не обязывает отображать на механизм try/catch исключения, не имеющие своим источником throw. Просто потому, что любые такие исключительные ситуации не могут быть стандартизированы, ибо они платформозависимы.
          Цитата Qraizer @
          повстанец, SEH - это часть интерфейса WinAPI, предоставляемый ОС.

          Так он даже не SEH поймать не может:
          ExpandedWrap disabled
            throw std::exception();

          Это вроде как С++ исключение.
            Не, бесполезно. Я на разрабочиков g++ не в обиде- в конце концов мне компилятор беслатно достался. Но я думаю рано отчаиваться тем более, что в хидерах g++ определены виды системных исключений (для чего-то ведь это сделано!). Мне кажется, я мог бы глубже вникнуть в эту проблему, если бы получил ответы на такие глупые вопросы, до которых недавно додумался:

            ExpandedWrap disabled
              catch (сюда пишется [I]тип аргумент[/I] или сам [I]тип[/I]?)
            Это из учебника

            Ну так будем последовательны. Какой тип имеют системные исключения?
            Всё же просто, вот они так определены:

            ExpandedWrap disabled
              #define STATUS_ACCESS_VIOLATION 0xC0000005
              #define EXCEPTION_ACCESS_VIOLATION  STATUS_ACCESS_VIOLATION
            Ну так и надо тип узнать... Но как?
            Если я буду знать имя типа, всё вперёд, может у меня из-за несоответствия типу не срабатывает блок catch!

            надо будет спросить у niXman, который mingw толкает, есть там поддержка исключений или нет...
            :D
              Не поддерживает GCC SEH-исключения пока. А EXCEPTION_STACK_OVERFLOW - это как раз SEH.
              Цитата
              Structured Exception Handling (SEH)

              Windows uses its own exception handling mechanism known as Structured Exception Handling (SEH). A great overview of this mechanism can be found here.

              Unfortunately, GCC does not support SEH yet. Casper Hornstrup had created an initial implementation, but it was never merged into mainline GCC. Some people have expressed concerns over a Borland patent on SEH, but Borland seems to dismiss these concerns as balderdash.


              На хрена я мучился? Надо было тебе, повстанец, доки внимательно изучить сначала. А насчет С++ исключений, вот такой код их ловит:

              ExpandedWrap disabled
                  try
                  {
                  throw std::exception();
                  }
                 catch(std::exception &except)
                 {
                    printf("We catched std::exception with message: %s\n",except.what());
                 }
                 catch(...)
                 {
                     printf("We catched unknown exception.\n");
                 }


              Компилить так:
              ExpandedWrap disabled
                g++-4 -fexceptions main.cpp -o main.exe


              Добавлено
              Но если очень уж надо ловить SEH, можешь поробоватьт поставить LibSEH. Описание и примеры кода здесь.

              Спасибо не надо, лучше в следующий раз внимательнее доки читай и пользуйся поиском понастойчивее. :)
              Сообщение отредактировано: neokoder -
                Надо было не мучаться, а читать тему. Об этом меня уже спрашивали, я честно ответил:
                ExpandedWrap disabled
                  Я ж только-только начал заниматься исключениями... Откуда же мне знать, есть оно там или нет?

                И ещё: ну, допустим, не поддерживаются SEH исключения, а зачем же они тогда в хидерах определены?

                Далее, там говорится о gcc, а у меня g++
                Я понимаю, что они где-то даже похожи, но у меня по g++ процесс gcc даже не повляется, а появляется процесс cc1plus

                Короче, спрошу-ка я у niXmanа, он точно знает. А пока вопрос открыт:
                исключениями КАКОГО ТИПА являются системные исключения?

                ...Про библиотеку ой как рано делать выводы, я чера такого монстра скачал-скачал
                http://code.google.com/p/exceptions4c/

                Это тоже библиотека исключений
                А чё толку-то? Пришлось удалять. Может, конечно, руки кривые, только если другие билиотеки работают, так они и работают (графика и потоки я имею ввиду). Уж я всяко изгалялся, а всё равно линкёр ошибку выдавал и всё, что он не находит функций, я уж и библиотеки вручную подключал- бесполезно. Короче, удалил. Завтра буду мучаться.
                Сообщение отредактировано: повстанец -
                  GCC это - GNU Compiler Collection.
                  GCC - также это изначально С-компилятор.
                  G++ - это GNU C++, компилятор для языка С++. Это часть этой коллекции.
                  Проще говоря если нет для GCC, значит нет и для G++.

                  Что у тебя стоит Cygwin или Mingw?
                    У меня ничё, у меня просто сборка. Я качнул сперва пустую Dev-C++, а потом начал её оснащать пакетами по отдельности
                    binutils, gcc-core и ещё несколько пакетов. Старался брать поновее. Короче, как получилось так и получилось.
                      Цитата повстанец @
                      исключениями КАКОГО ТИПА являются системные исключения?
                      повстанец, SEH и C++ exception handling - это разные механизмы. Даже в MSных компиляторах, чтобы их можно было использовать сообща, требуется ключик компилятору, и даже в этом случае SEH не может использоваться в той же функуции, где уже присутствует try/catch и наоборот, а также в функции, которая содержит автоматические объекты с нетривиальными деструкторами.
                      Твой вопрос лишён смысла. Почитай про SEH в MSDN, в частности про RaiseException(), WinAPIшный аналог throw. Ты можешь функцией-фильтром транслировать SEH в некий класс (читай тип) и ловить его. Примерно как в коде выше. Для этого сначала требуется разобраться с исключениями в g++. Не исключено, что по дефолту они просто выключены, поэтому ты не смог поймать даже банальный Стандартный std::exception Стандартным же catch. Вообще, странно, у меня они работали "из коробки", безо всяких ключиков.
                        Цитата Qraizer @
                        Вообще, странно, у меня они работали "из коробки", безо всяких ключиков.

                        Вот и у меня тоже С++ исключения ловятся нормально при компиляции с GCC из Cygwin(поставил последнюю версию). Вообще DEV-C++ последняя версия обычно идёт в комплекте с MinGW(в котором есть уже GCC), но старым, и он как написал всё вручную ставил может из-за этого какие-то глюки.

                        В общем итог такой: микрософтовский SEH в GСС не реализован в принципе, значит ловить по-нормальному EXCEPTION_STACK_OVERFLOW не получится, а те либы одну из которых я порекомендовал скорее всего банальные костыли и поэтому работать будут через раз, и в частности libSEH даже не раскручивает стек после исключения. Поэтому, если у автора возникла изначально задача проследить за переполнением стека, то я бы ему рекомендовал сделать самому стек в динамической памяти, который будет полностью под его контролем, обработку переполнения и расширение можно будет делать легко и просто. Как считаешь, Qraizer? Думаю это лучший выход из ситуации, чем возиться со сторонними либами-костылями ;) .
                        Сообщение отредактировано: neokoder -
                          Начиная с какой версии есть обработка системных исключений?

                          Эта тема была разделена из темы "Сборки MinGW(GCC-win32) от niXman"

                          Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH"
                          Сообщение отредактировано: повстанец -
                            Нету в GCC поддержки SEH на уровне компилятора.

                            http://gcc.gnu.org/wiki/WindowsGCCImprovements

                            Цитата
                            Windows uses its own exception handling mechanism known as Structured Exception Handling (SEH). A great overview of this mechanism can be found here.
                            Unfortunately, GCC does not support SEH yet. Casper Hornstrup had created an initial implementation, but it was never merged into mainline GCC.


                            Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH"
                              Цитата повстанец @
                              обработка системных исключений

                              это еще что такое? оО

                              Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH"
                                Цитата niXman @
                                это еще что такое? оО

                                что-то типа такого:
                                ExpandedWrap disabled
                                  __try
                                  {
                                      *((int *)0) = 0;
                                  }
                                  __catch
                                  {
                                      std::cout << "segment fault" << std::endl;
                                  }

                                только я не понимаю зачем это нужно.

                                Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH"
                                Сообщение отредактировано: DEADHUNT -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (10) 1 [2] 3 4 ...  9 10 все


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