in include/wil/result_macros.h [3136:3223]
inline HRESULT ResultFromKnownExceptions(const DiagnosticsInfo& diagnostics, void* returnAddress, SupportedExceptions supported, IFunctor& functor)
{
if (supported == SupportedExceptions::Default)
{
supported = g_fResultSupportStdException ? SupportedExceptions::Known : SupportedExceptions::ThrownOrAlloc;
}
if ((details::g_pfnResultFromKnownExceptions_WinRt != nullptr) &&
((supported == SupportedExceptions::Known) || (supported == SupportedExceptions::Thrown) || (supported == SupportedExceptions::ThrownOrAlloc)))
{
return details::g_pfnResultFromKnownExceptions_WinRt(diagnostics, returnAddress, supported, functor);
}
switch (supported)
{
case SupportedExceptions::Known:
try
{
return functor.Run();
}
catch (const ResultException& exception)
{
return ResultFromKnownException(exception, diagnostics, returnAddress);
}
catch (const std::bad_alloc& exception)
{
return ResultFromKnownException(exception, diagnostics, returnAddress);
}
catch (std::exception& exception)
{
return ResultFromKnownException(exception, diagnostics, returnAddress);
}
catch (...)
{
auto hr = ResultFromKnownException_CppWinRT(diagnostics, returnAddress);
if (FAILED(hr))
{
return hr;
}
// Unknown exception
throw;
}
case SupportedExceptions::ThrownOrAlloc:
try
{
return functor.Run();
}
catch (const ResultException& exception)
{
return ResultFromKnownException(exception, diagnostics, returnAddress);
}
catch (const std::bad_alloc& exception)
{
return ResultFromKnownException(exception, diagnostics, returnAddress);
}
case SupportedExceptions::Thrown:
try
{
return functor.Run();
}
catch (const ResultException& exception)
{
return ResultFromKnownException(exception, diagnostics, returnAddress);
}
case SupportedExceptions::All:
try
{
return functor.Run();
}
catch (...)
{
return wil::details::ReportFailure_CaughtException<FailureType::Log>(__R_DIAGNOSTICS_RA(diagnostics, returnAddress), supported);
}
case SupportedExceptions::None:
return functor.Run();
case SupportedExceptions::Default:
WI_ASSERT(false);
}
WI_ASSERT(false);
return S_OK;
}