Информация об изменениях

Сообщение Re: Для чего отключать обработку исключений? от 12.06.2018 9:22

Изменено 12.06.2018 9:35 sergii.p

Re: Для чего отключать обработку исключений?
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет всем!


МР>В Visual Studio есть опция для отключения обработки исключений: C/C++ -> Code Generation -> Enable C++ exceptions

МР>Скажите, пожалуйста, для чего может быть нужно отключать исключения в C++ коде? И как это вообще возможно, ведь, например оператор new или классы STL могут выбрасывать исключения.

исключения не отключаются. Это видимо неудачное название. Если выбрать Enable C++ exceptions — No, то не будут отрабатывать деструкторы для объектов. Я не понимаю, зачем это может быть нужно (может кто подскажет), но компилятор студии warning выдаст (C4530 и в рекомендациях предложит включить /EHsc обратно).

class Test
{
public:
    Test() = default;
    ~Test()
    {
        std::cout << U"Без /EHsc вызваться мне не судьба" << std::endl;
    }
};

void throwException()
{
    Test t;
    throw std::exception();
}


int main()
{
    __try
    {
        throwException();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        std::cout << "SEH execute handler" << std::endl;
    }
    return 0;
}
Re: Для чего отключать обработку исключений?
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет всем!


МР>В Visual Studio есть опция для отключения обработки исключений: C/C++ -> Code Generation -> Enable C++ exceptions

МР>Скажите, пожалуйста, для чего может быть нужно отключать исключения в C++ коде? И как это вообще возможно, ведь, например оператор new или классы STL могут выбрасывать исключения.

исключения не отключаются. Это видимо неудачное название. Если выбрать Enable C++ exceptions — No, то не будут отрабатывать деструкторы для объектов. Я не понимаю, зачем это может быть нужно (видимо только если у нас исключения не водятся и разматывать стек не требуется), но компилятор студии warning выдаст (C4530 и в рекомендациях предложит включить /EHsc обратно).

class Test
{
public:
    Test() = default;
    ~Test()
    {
        std::cout << U"Без /EHsc вызваться мне не судьба" << std::endl;
    }
};

void throwException()
{
    Test t;
    throw std::exception();
}


int main()
{
    __try
    {
        throwException();
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        std::cout << "SEH execute handler" << std::endl;
    }
    return 0;
}