Вопрос

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

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.В чем может быть причина разницы?

Это было полезно?

Решение

Включить обработку структурированных исключений в проекте - > свойства - > свойства конфигурации - > 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;
}

Другие советы

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

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

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

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

Для действительных значений в __except глянь сюда

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top