Перехват исключения в коде

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

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, обработчик catch был выполнен, и на выходе получилось «Перехваченное исключение». Однако, когда я скомпилировал это с помощью VS2008, программа вылетела без выполнения блока catch. В чем может быть причина разницы?


person Naveen    schedule 08.03.2009    source источник


Ответы (4)


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

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

#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;
}
person Tim Matthews    schedule 08.03.2009
comment
TRUE не является допустимым значением для фильтра исключений. посмотрите msdn.microsoft.com/en-us/library /s58ftw19(VS.80).aspx - person shoosh; 08.03.2009
comment
Он неявно приводится к той же константе для 1, компилируется и работает нормально. - person Tim Matthews; 08.03.2009

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

person Community    schedule 08.03.2009

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

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

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

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

person shoosh    schedule 08.03.2009
comment
Правильный фильтр хорош для реального кода, но я упростил его, например, в своем ответе. - person Tim Matthews; 08.03.2009

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

person Mykola Golubyev    schedule 08.03.2009