Я не программист Windows, но мне кажется, что использование структурированной обработки исключений для обработки аппаратных исключений, таких как программные исключения, означает, что:
- Ваш код выполняет то, что в стандарте C ++ вызывает неопределенное или определяемое реализацией поведение (например, деление на ноль).
- Windows определяет, что при включенном SEH в этом случае выдается исключение.
- Вы используете этот факт для перехвата исключения и / или выполнения обработчика завершения.
Итак, ИМО задает следующие вопросы:
- Является ли ваша задача программирования в природе, которую стандарт C ++ не может обработать? (или может обрабатывать только способом, который заметно уступает тому, что вы получаете, допуская аппаратное исключение).
- Вам действительно нужно действовать, когда ваш код нестандартен?
- Можете ли вы написать свой код, чтобы он не вызывал аппаратные исключения?
Если ответы «да», «да», «нет», то необходима обработка структурированных исключений. В противном случае вы сможете избежать этого, и в этом случае вы, вероятно, захотите. Написание кода, исключающего исключения, сложнее, поэтому чем сильнее исключение, тем лучше вы можете его предложить. Код, который может делиться на ноль с помощью SEH, не дает гарантии nothrow, хотя, возможно, с небольшим изменением дизайна, чтобы вызывающие абоненты не передавали ему пустые данные, это могло бы быть сделано. Но если функция уже должна генерировать исключения по другим причинам, то, возможно, и их выброс для аппаратных ловушек может не ухудшить ситуацию.
Один примечательный особый случай - распределение памяти. Не уверен, что .NET делает это, но в linux распределение завершается неудачно, только если для размещения недостаточно виртуального адресного пространства. Физическая память выделяется при первом использовании и вызывает аппаратное исключение, если его недостаточно. Поскольку выделение памяти составляет , предполагается для выброса std :: bad_alloc в случае сбоя, и реализация не может реализовать это требование стандарта, может быть в том, что в некоторых случаях преобразование аппаратного исключения в Программное обеспечение - правильная вещь. Однако это аппаратное исключение может возникать в неожиданных местах (в том числе в подпрограммах, которые вы считали не слишком быстрыми), поэтому по-прежнему может быть невозможно обработать изящно, именно поэтому ядро linux сбрасывает, а не выбрасывает. На практике все, что инициализируется полностью, приводит к сбою его конструктора, который часто достаточно близок к распределению, что вместо этого было бы полезно программное исключение.