In Windows 7 an new weapon in the fight against bugs was released in the form of RaiseFailFastException

In a world where Windows Error Reporting (WER) collects each crash and reports it with a minidump. FAIL_FAST is essential to finding and fixing bugs quickly. Instead of laboring for a repro, just open the minidump and it points to the line of code that failed and usually has enough state to determine the cause.

FAIL_FAST should be used to report bugs in code. Transient or environmental failures like no-memory or access-denied are not suited for reporting via FAIL_FAST, rather things like 'I do not understand this enum value' or 'I did not expect this error value'


#define FAIL_FAST_FILTER() \
__except(FailFastFilter(GetExceptionInformation())) \
{ \
} do {} while(0,0)

inline
LONG WINAPI FailFastFilter(
__in struct _EXCEPTION_POINTERS* exceptionInfo)
{
RaiseFailFastException(
exceptionInfo - > ExceptionRecord,
exceptionInfo - > ContextRecord,
0);
return EXCEPTION_CONTINUE_SEARCH;
}

template<typename Function>
auto FailFastOnThrow(
Function && function) -> decltype(
std::forward<Function>(function)())
{
//
// __ try must be isolated in its own
// function in order for the compiler
// to reason about C++ unwind in the
// calling and called functions.
//
__try {
return std::forward <Function >(function)();
}
FAIL_FAST_FILTER();
}

#define FAIL_FAST_ON_THROW(Function) \
FailFastOnThrow((Function))

#define FAIL_FAST(Code) \
FAIL_FAST_ON_THROW(
[&]{ \
RaiseException( \
(Code), \
EXCEPTION_NONCONTINUABLE, \
0, \
nullptr \
); \
} \
)