Visual C ++ неуправляемый код: использование / EHA или / EHSC для исключения C ++?

StackOverflow https://stackoverflow.com/questions/4414027

Вопрос

Если я создаю новый проект в неуправляемом C ++, Visual Studio 2008 или выше, какая модель обработки исключений я хочу пойти с?

Я понимаю, что / eHa вариант приводит к менее эффективному коду, а также ловит исключения SEH, верно?

Таким образом, я был очищен от этого варианта и, как правило, идут с / eHSC, так что я только ловлю исключения C ++, которые фактически брошены и не ловят нарушения доступа и другие структурированные исполнения, в обработчиках (...). Если в моем коде есть нарушение доступа, я не хочу, чтобы он был замаскирован уловкой (...) {}.

Я код с другими, кто хочет поймать (...) {} ничего не делать, и они даже хотят это сделать, если есть нарушение доступа, которое кажется мне очень плохой идеей. Если есть ошибка из-за плохого кодирования, вы не хотите торнуть пальцами в уши и громко говорят: «La la la la la!» Так что вам не нужно иметь сбой программы? На самом деле, если код теперь находится в плохом состоянии из-за ошибки кодирования, вы действительно хотите, чтобы код продолжился?

Таким образом, моя общая мысль заключается в том, что / EHA создает более крупный / более медленный код, и он позволяет программистам сойти с написанием кода, если присутствует фатальная ошибка, она будет продолжать работать в неопределенном состоянии.

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

Пожалуйста, взвесьте с вашими мыслями.

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

Решение

/ EHA делает две вещи. Прежде всего, он подавляет оптимизацию, которая пропускает фильтры исключения, которые автоматически вызывают разрушители локальных переменных классов, если анализатор кода не может видеть какой-либо код, который может бросить исключение C ++. Это делает стек без разморозки для любого исключения, а не только исключение C ++. Накладные расходы на эти фильтры исключения - это время на X86 и пространстве на X86, так и на X64.

И да, это изменяет поведение улов (...), теперь он также фильтрует любое исключение SEH, а не только C ++. Это действительно азартная игра, потому что вы ловите все действительно неприятные вещи, асинхронные аппаратные исключения. Хотя я лично не думаю, что ловить все исключения C ++ очень оправдано, у вас все еще есть, но смутное представление о том, какую степень была мутирована состояние программы и почему она провалилась.

Реально, вам нужно перейти на использование __try/__except Так что вы можете написать свой собственный фильтр исключения и избежать ловить плохие. Код исключения для исключения C ++ составляет 0xe04D5343 («MSC»). Использование _set_se_translator () было бы другим подходом.

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

Я использую / EHA, потому что он безопасен с .NET Interop, тогда как / EHSC не может быть; видеть Разрушители, не вызываемые при наживленном (C ++) исключения распространяются на компонент CLR Например.

Однако, если для конкретного бита кода дополнительная производительность действительно имеет значение, и вам не нужна .NET (или что-то еще) совместимость, то, безусловно, / EHSC звучит нормально.

Ни / EHSC, ни / EHA не уволяют большинство ошибок памяти, поэтому используя их, чтобы поймать нарушения доступа - безнадежный случай.

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