Structured Exception Handling basics

OS provides SEH to deal directly with crashes.

SEH is language independent but is usually implemented in C/C++.

Pair __try/__except allows to set code inside __try and handle exception in __except ( Pair __try/__finally ensures that section of code in __finally is always executed even if __try block terminates prematurely (

__except is an exception filter for one of 3 values:

Value Meaning
EXCEPTION_EXECUTE_HANDLER The system transfers control to the exception handler, and execution continues in the stack frame in which the handler is found.
EXCEPTION_CONTINUE_SEARCH The system continues to search for a handler.
EXCEPTION_CONTINUE_EXECUTION The system stops its search for a handler and returns control to the point at which the exception occurred. If the exception is noncontinuable, this results in an EXCEPTION_NONCONTINUABLE_EXCEPTION exception.
void f() { __try { __try { // some code } __except (EXCEPTION_EXECUTE_HANDLER) { // process the exception } } __finally { // executed regardless of whether function caused a crash } }

Exception handler can determine exception value with GetExceptionCode function ( which can be called only in exception filters.

__try { n = x / y; } __except (EXCEPTION_INT_DIVIDE_BY_ZERO == GetExceptionCode() ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { n = NaN; }

In __except user function can be called. GetExceptionInformation ( returns a pointer to structure with exception info.

To generate an exception RaiseException ( can be used.

SEH limitations:

  • error codes are limited to unsigned int.
  • doesn’t mix with C++ exceptions.
  • doesn’t call any of object destructors.

Additional reading: