in include/wil/result_macros.h [3732:3769]
inline ResultStatus ReportFailure_CaughtExceptionCommon(__R_FN_PARAMS_FULL, _Inout_updates_(debugStringChars) PWSTR debugString, _Pre_satisfies_(debugStringChars > 0) size_t debugStringChars, SupportedExceptions supported)
{
bool isNormalized = false;
auto length = wcslen(debugString);
WI_ASSERT(length < debugStringChars);
ResultStatus resultPair;
if (details::g_pfnResultFromCaughtExceptionInternal)
{
resultPair = details::g_pfnResultFromCaughtExceptionInternal(debugString + length, debugStringChars - length, &isNormalized);
}
const bool known = (FAILED(resultPair.hr));
if (!known)
{
resultPair = ResultStatus::FromResult(__HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION));
}
ReportFailureOptions options = ReportFailureOptions::ForcePlatformException;
WI_SetFlagIf(options, ReportFailureOptions::MayRethrow, isNormalized);
if ((supported == SupportedExceptions::None) ||
((supported == SupportedExceptions::Known) && !known) ||
((supported == SupportedExceptions::Thrown) && !isNormalized) ||
((supported == SupportedExceptions::Default) && !known && g_fResultFailFastUnknownExceptions))
{
// By default WIL will issue a fail fast for unrecognized exception types. Wil recognizes any std::exception or wil::ResultException based
// types and Platform::Exception^, so there aren't too many valid exception types which could cause this. Those that are valid, should be handled
// by remapping the exception callback. Those that are not valid should be found and fixed (meaningless accidents like 'throw hr;').
// The caller may also be requesting non-default behavior to fail-fast more frequently (primarily for debugging unknown exceptions).
ReportFailure_Base<FailureType::FailFast>(__R_FN_CALL_FULL, resultPair, debugString, options);
}
else
{
ReportFailure_Base<T>(__R_FN_CALL_FULL, resultPair, debugString, options);
}
return resultPair;
}