Для чего отключать обработку исключений?
От: Максим Рогожин Россия  
Дата: 02.06.18 04:38
Оценка:
Привет всем!

В Visual Studio есть опция для отключения обработки исключений: C/C++ -> Code Generation -> Enable C++ exceptions
Скажите, пожалуйста, для чего может быть нужно отключать исключения в C++ коде? И как это вообще возможно, ведь, например оператор new или классы STL могут выбрасывать исключения.
Re: Для чего отключать обработку исключений?
От: SomeOne_TT  
Дата: 02.06.18 05:21
Оценка: 2 (1) +2
Здравствуйте, Максим Рогожин, Вы писали:

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


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

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

Есть методология разработки ПО на С++ без исключений. Емнип гугл кодстайл запрещает использоваение исключений.
Все системные либы плюсов могут вместо исключений возвращать код ошибки.
Re: Для чего отключать обработку исключений?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.06.18 07:29
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Скажите, пожалуйста, для чего может быть нужно отключать исключения в C++ коде?


Чтобы использовать код там, где обработка исключений не поддерживается — например, в ядре на повышенных приоритетах.

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


Оператор new — это всего лишь функция, которую можно переопределить. Классы и функции стандартной библиотеки никто не заставляет использовать. Порой бывает нужно написать что-то на "голом языке", без внешних средств вообще (например, тот же обработчик прерывания в ядре). Если не отключить обработку прерываний, компилятор будет добавлять специальный код в пролог/эпилог каждой функции. Этот код мало того, что будет лишним — он еще и не даст собрать исполняемый модуль, ибо ссылается на функици стандартной библиотеки, а те тянут за собой поддержку среды, доступной только в пользовательском режиме.
Re: Для чего отключать обработку исключений?
От: sergii.p  
Дата: 12.06.18 09:22
Оценка: -1 :)
Здравствуйте, Максим Рогожин, Вы писали:

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


МР>В 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;
}
Отредактировано 12.06.2018 9:35 sergii.p . Предыдущая версия .
Re[2]: Для чего отключать обработку исключений?
От: Максим Рогожин Россия  
Дата: 12.06.18 14:51
Оценка:
Здравствуйте, SomeOne_TT, Вы писали:

SO_>Есть методология разработки ПО на С++ без исключений. Емнип гугл кодстайл запрещает использоваение исключений.


А подобные методологии ограничивают выбор доступных сторонних библиотек?
Re[2]: Для чего отключать обработку исключений?
От: Максим Рогожин Россия  
Дата: 12.06.18 14:54
Оценка:
Здравствуйте, sergii.p, Вы писали:

А почему вы кидаете std::exception, а ловите с помощью SEH __try __except ?
Re[3]: Для чего отключать обработку исключений?
От: sergii.p  
Дата: 13.06.18 07:55
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Здравствуйте, sergii.p, Вы писали:


МР>А почему вы кидаете std::exception, а ловите с помощью SEH __try __except ?


собственно, всё равно чем ловить. Главное, что не отрабатывает деструктор объекта Test. Изначально пример унёс отсюда https://msdn.microsoft.com/en-us/library/1deeycx5.aspx, хотел показать, что и при бросании асинхронных исключений происходит тоже самое. Но потом уменьшил код до необходимого минимума.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.