Помогите с Try Catch - PullRequest
       1

Помогите с Try Catch

2 голосов
/ 02 августа 2010

Я использую GLUTesselator, и время от времени происходит сбой EndContour (), поэтому я сделал это:

         try
        {
            PolygonTesselator.End_Contour();
        }
        catch (int e)
        {
            renderShape = false;
            return;
        }

С чего бы это все-таки зависало, оно должно правильно выполнять код перехвата? Как я мог это исправить?

Спасибо

Ответы [ 7 ]

10 голосов
/ 02 августа 2010

Есть ли PolygonTesselator.End_Contour ();сбой или выбрасывает исключение?

Обратите внимание, что настоящий «сбой» (segfault, недопустимая инструкция и т. д.) не вызывает исключение в смысле C ++.

В этих случаяхCPU вызывает прерывание - это также иногда называют исключением, но оно не имеет ничего общего с исключением C ++.

В C ++ вы работаете на реальном процессоре - а не на виртуальной машине, как в Java, где каждая памятьнарушение приводит к выполнению языка, например NullPointerException или ArrayOutOfBoundsException.

В C / C ++ исключение / прерывание / прерывание ЦП обрабатывается операционной системой и направляется процессу как «сигнал».Вы можете перехватить сигнал, но обычно это не помогает при сбоях (SIGSEG, SIGILL, SIGFPU и т. Д.).

4 голосов
/ 02 августа 2010

Вы получаете исключение SEH или Структурную обработку исключений. Эти исключения создаются Windows в совершенно другой системе, поскольку SEH предшествует C ++, и не могут быть перехвачены стандартным блоком перехвата C ++ (однако MSVC обеспечивает перехват SEH).

В качестве альтернативы, если вы работаете в Unix, ядро ​​также не использует исключения C ++. Он использует сигналы. Я не претендую на понимание сигналов, так как я не разрабатываю для Unix, но я уверен, что они не являются исключениями C ++.

Вы нарушили аппаратное правило, запрещающее отмену ссылки на указатель NULL. Вы получите ошибку на уровне ОС, по исключению или по сигналу. Вы не можете поймать эти вещи в блоке C ++ catch просто так.

Редактировать: Если вы используете MSVC в Windows и недавно установили компилятор, вы можете включить / EHa, что позволяет вам перехватывать структурированные исключения, а также исключения C ++. Я написал этот код, который работает так, как показано:

int main() {
    std::string string = "lolcakes";
    try {
        Something s;
        int i, j;
        i = 0; j = 1;
        std::string input;
        std::cin >> input;
        if (input == "Structured")
            int x = j / i;
        else
            throw std::runtime_error("Amagad hai!");
    }
    catch(std::runtime_error& error) {
        std::cout << "Caught a C++ exception!" << std::endl;
    }
    catch(...) {
        std::cout << "Caught a structured exception!" << std::endl;
    }
    return main();
}

Структурированные исключения включают нарушения прав доступа, ваша конкретная ошибка.

2 голосов
/ 02 августа 2010

Поскольку все, что вы хотите сделать, когда приходит исключение, это установить для renderShape значение false, я бы порекомендовал следующий код:

     try
    {
        PolygonTesselator.End_Contour();
    }
    catch (...) // takes any type of exception
    {
        renderShape = false;
        return;
    }

Конечно, если вы действительно не можете исправить источникк самому исключению !!

1 голос
/ 02 августа 2010

Две вещи:

  • Если вы находитесь под VC 6 или более поздней версии, используйте __try {} __, кроме (EXCEPTION_EXECUTE_HANDLER) {}. Это поймает SE. try / catch только перехватывает исключения C ++
  • Мне было тяжело с GLU, поэтому я могу сказать вам следующее: если вы можете установить нормальное значение, УСТАНОВИТЕ ЭТО. Но в остальном это правда, что это довольно солидно.
1 голос
/ 02 августа 2010

Как уже упоминалось, это исключение SEH.
Если вы используете Visual Studio, вы можете настроить свой проект на перехват исключений SEH в блоке try / catch.

Свойства проекта> C / C ++> Генерация кода> Включить исключения C ++> Да с исключениями SEH

1 голос
/ 02 августа 2010

Если ваша программа выходит из строя с сообщением error reading from location 0x000000000, то это происходит не из-за исключения, а из-за сбоя.Вы можете использовать утилиту segvcatch , чтобы преобразовать ошибки сегмента в перехватываемые исключения.Посмотрите их примеры.

1 голос
/ 02 августа 2010

С чего бы это все-таки падать, оно должно выполнить код перехвата правильно? Как можно это исправить?

Скорее всего, потому что вы на самом деле не ловите то, что бросили. Вы уверены, что PolygonTesselator.End_Contour(); бросает int?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...