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

另请参阅

ILanguageExceptionErrorInfo2