В семействе ОС Microsoft Windows используются некоторые обработка исключений механизмы, основанные на особенностях операционной системы.
Обработка структурированных исключений Microsoft - это собственный механизм обработки исключений для Windows и предшествующая технология для Vectored Обработка исключений (VEH). В нем реализован механизм finally
, отсутствующий в стандартных исключениях C ++ (но присутствующий в большинстве императивных языков, представленных позже). SEH настраивается и обрабатывается отдельно для каждого потока выполнения .
Microsoft поддерживает SEH как метод программирования только на уровне компилятора. В компиляторе MS Visual C ++ есть три нестандартных ключевых слова: __try
, __except
и __finally
- для этого. Другие аспекты обработки исключений поддерживаются рядом функций Win32 API, например, RaiseException
для ручного создания исключений SEH.
Каждый поток выполнения в Windows IA-32 редакции или WoW64 Уровень эмуляции для версии x86-64 имеет ссылку на недокументированный список _EXCEPTION_REGISTRATION_RECORD в начале своего блока информации о потоке. Оператор __try
по существу вызывает определенную компилятором функцию EH_prolog
. Эта функция выделяет _EXCEPTION_REGISTRATION_RECORD в стеке, указывая на функцию __except_handler3
в msvcrt.dll
, затем добавляет запись в начало списка. В конце блока __try
вызывается определяемая компилятором функция EH_epilog
, которая выполняет обратную операцию. Любая из этих определяемых компилятором подпрограмм может быть встроенной. Все определенные программистом блоки __except
и __finally
вызываются из __except_handler3
. Если присутствуют блоки, определенные программистом, _EXCEPTION_REGISTRATION_RECORD, созданный EH_prolog
, расширяется несколькими дополнительными полями, используемыми __except_handler3
.
В случае исключения в пользовательском режиме, операционная система анализирует список _EXCEPTION_REGISTRATION_RECORD потока и последовательно вызывает каждый обработчик исключений до тех пор, пока обработчик не сообщит, что он обработал исключение (с помощью возвращаемого значения ) или список не будет исчерпан. Последним в списке всегда является kernel32! UnhandledExceptionFilter
, который отображает сообщение об ошибке General protection fault. Затем список просматривается еще раз, давая обработчикам возможность очистить все используемые ресурсы. Наконец, выполнение возвращается в режим ядра, где процесс либо возобновляется, либо завершается.
Патент на этот режим SEH, US5628016, истек в 2014 году.
SEH в 64-битной Windows проще, так как предполагает только использование таблица вместо того, чтобы компилятор генерировал код.
GCC 4.8+ из Mingw-w64 поддерживает использование 64-битного SEH для исключений C ++. LLVM clang поддерживает __try
как на x86, так и на x64.
Векторная обработка исключений была представлена в Windows XP. Векторная обработка исключений доступна для программистов Windows, использующих такие языки, как C ++ и Visual Basic. VEH не заменяет структурированную обработку исключений (SEH), скорее, VEH и SEH сосуществуют, причем обработчики VEH имеют приоритет над обработчиками SEH. По сравнению с SEH, VEH работает больше как доставляемые ядром сигналы Unix.
/ link / safeseh: no
.