ILanguageExceptionErrorInfo2::CapturePropagationContext 方法 (restrictederrorinfo.h)
跨语言边界和线程捕获异常的上下文。
语法
HRESULT CapturePropagationContext(
[in] IUnknown *languageException
);
参数
[in] languageException
一个错误对象,它是跨进程的单元敏捷、进程内和按值封送的错误对象。
返回值
如果该方法成功,则返回 S_OK。 否则,将返回 HRESULT 错误代码。
注解
CapturePropagationContext 在重新引发错误时由语言投影使用。 这包括在语言边界处收到错误时。 因此,利用 CapturePropagationContext 有助于确保为当前重新引发捕获异常的后台跟踪。 这也有助于确保在异常越过语言边界时不会丢失相关的调试信息。
一般来说, 方法会创建 IRestrictedErrorInfo 对象的链接列表,这些对象提供有关异常传播方式的其他错误信息。 此信息在故障转储分析期间作为异常记录引用的存储异常公开。 使用此链接列表,可以观察异常传播到的所有语言边界和线程的回溯,包括错误的来源。
示例
以下示例演示从另一个投影或 WRL 在其语言边界处接收错误的投影。 这是现有方案,但如果上一个投影无法捕获,则允许系统捕获其他上下文。
HRESULT CreateFooExceptionFromLanguageBoundaryError(HRESULT errorReceived, IFooException** createdException)
{
HRESULT hr = S_OK;
ComPtr<IFooException> exception;
// Get the current error
ComPtr<IRestrictedErrorInfo> restrictedErrorInfo;
*createdException = nullptr;
if (SUCCEEDED(GetRestrictedErrorInfo(&restrictedErrorInfo)))
{
// Retrieve details regarding the error to determine if it is a stale error
// or if it is the error we received at the boundary.
BSTR description;
HRESULT errorOriginated;
BSTR restrictedDescription;
BSTR capabilitySid;
hr = restrictedErrorInfo->GetErrorDetails(
&description,
&errorOriginated,
&restrictedDescription,
&capabilitySid);
if (SUCCEEDED(hr) && errorReceived == errorOriginated)
{
hr = CreateFooException(
errorOriginated,
restrictedDescription,
restrictedErrorInfo.Get(),
&exception);
// Query for new interface to see if the new logic is there to
// capture the current propagation context.
ComPtr<ILanguageExceptionErrorInfo2> languageExceptionErrorInfo;
if (SUCCEEDED(restrictedErrorInfo.As(&languageExceptionErrorInfo)))
{
languageExceptionErrorInfo->CapturePropagationContext(nullptr);
}
*createdException = exception.Detach();
SetRestrictedErrorInfo(restrictedErrorInfo.Get());
SysFreeString(description);
SysFreeString(restrictedDescription);
SysFreeString(capabilitySid);
return hr;
}
SysFreeString(description);
SysFreeString(restrictedDescription);
SysFreeString(capabilitySid);
}
// We are here if the error didn't match or we couldn't get error details.
// So originate a new error.
// OriginateErrorInfoForThrow will call RoOriginateLanguageException, which will
// capture the context
hr = CreateFooException(errorReceived, nullptr, nullptr, &exception);
if(SUCCEEDED(hr))
{
exception->OriginateErrorInfoForThrow();
*createdException = exception.Detach();
}
return hr;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 10版本 1703 [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2016 [仅限桌面应用] |
目标平台 | Windows |
标头 | restrictederrorinfo.h |