В Visual Studio есть опция для отключения обработки исключений: C/C++ -> Code Generation -> Enable C++ exceptions
Скажите, пожалуйста, для чего может быть нужно отключать исключения в C++ коде? И как это вообще возможно, ведь, например оператор new или классы STL могут выбрасывать исключения.
Здравствуйте, Максим Рогожин, Вы писали:
МР>Привет всем!
МР>В Visual Studio есть опция для отключения обработки исключений: C/C++ -> Code Generation -> Enable C++ exceptions МР>Скажите, пожалуйста, для чего может быть нужно отключать исключения в C++ коде? И как это вообще возможно, ведь, например оператор new или классы STL могут выбрасывать исключения.
Есть методология разработки ПО на С++ без исключений. Емнип гугл кодстайл запрещает использоваение исключений.
Все системные либы плюсов могут вместо исключений возвращать код ошибки.
Здравствуйте, Максим Рогожин, Вы писали:
МР>Скажите, пожалуйста, для чего может быть нужно отключать исключения в C++ коде?
Чтобы использовать код там, где обработка исключений не поддерживается — например, в ядре на повышенных приоритетах.
МР>И как это вообще возможно, ведь, например оператор new или классы STL могут выбрасывать исключения.
Оператор new — это всего лишь функция, которую можно переопределить. Классы и функции стандартной библиотеки никто не заставляет использовать. Порой бывает нужно написать что-то на "голом языке", без внешних средств вообще (например, тот же обработчик прерывания в ядре). Если не отключить обработку прерываний, компилятор будет добавлять специальный код в пролог/эпилог каждой функции. Этот код мало того, что будет лишним — он еще и не даст собрать исполняемый модуль, ибо ссылается на функици стандартной библиотеки, а те тянут за собой поддержку среды, доступной только в пользовательском режиме.
Здравствуйте, Максим Рогожин, Вы писали:
МР>Привет всем!
МР>В 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;
}
Здравствуйте, SomeOne_TT, Вы писали:
SO_>Есть методология разработки ПО на С++ без исключений. Емнип гугл кодстайл запрещает использоваение исключений.
А подобные методологии ограничивают выбор доступных сторонних библиотек?
Здравствуйте, Максим Рогожин, Вы писали:
МР>Здравствуйте, sergii.p, Вы писали:
МР>А почему вы кидаете std::exception, а ловите с помощью SEH __try __except ?
собственно, всё равно чем ловить. Главное, что не отрабатывает деструктор объекта Test. Изначально пример унёс отсюда https://msdn.microsoft.com/en-us/library/1deeycx5.aspx, хотел показать, что и при бросании асинхронных исключений происходит тоже самое. Но потом уменьшил код до необходимого минимума.