Поймать исключение в коде - PullRequest
4 голосов
/ 08 марта 2009

Я пробовал этот фрагмент кода, чтобы проверить, перехватывается ли исключение деления на ноль:

int main(int argc, char* argv[])
{
    try
    {
      //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    catch (...)
    {
        std::cout<<"Caught exception\n";
    }
    return 0;
}

Когда я выполнил это с помощью VC6, обработчик перехвата был выполнен, и на выходе было «Поймано исключение». Однако, когда я скомпилировал это с использованием VS2008, программа потерпела крах, не выполнив блок catch. В чем может быть причина разницы?

Ответы [ 4 ]

5 голосов
/ 08 марта 2009

Включить обработку структурированных исключений в проекте -> свойства -> свойства конфигурации -> c / c ++ -> генерация кода -> включить исключения c ++.

Используйте попытку кроме. В идеале с фильтром, который проверяет код исключения, а затем возвращает постоянную сигнализацию, если он хочет перехватить. Я пропустил это здесь, но я рекомендую вам посмотреть здесь для примеров фильтра.

#include <iostream>
#include <windows.h>

int main(int argc, char* argv[])
{
    __try
    {
        //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        if(GetExceptionCode()==EXCEPTION_INT_DIVIDE_BY_ZERO)
            std::cout << "Caught int divison exception\n";
        else
            std::cout << "Caught exception\n";

        system("pause");
    }
    return 0;
}
2 голосов
/ 08 марта 2009

Вы ловите исключения, сгенерированные слоем структурированной обработки исключений (SEH) Microsoft, который является специфической для Microsoft операционной системой. Как предположил Николай, вам, возможно, придется поработать с параметрами своего компилятора, но помните, что этот код не будет переносимым на другие операционные системы или даже на другие компиляторы, работающие в Windows.

1 голос
/ 08 марта 2009

Перейдите в свойства вашего проекта. В разделе C / C ++, Генерация кода, вы найдете «Включить исключения C ++». измените эту опцию на «Да, с исключениями SEH»

Имейте в виду, что вы сможете ловить исключения такого рода только с помощью:

  • try {} catch(...) {} (с многоточием)
  • __try {} __except() {} (с соответствующим фильтром в __except)
  • с помощью SetUnhandledExceptionFilter()

Допустимые значения в __except см. Здесь

0 голосов
/ 08 марта 2009

В случае Visual Studio это могут быть параметры компилятора. Но по умолчанию исключение не будет выброшено.

...