Поделиться через


Метод ILanguageExceptionErrorInfo2::CapturePropagationContext (restrictederrorinfo.h)

Фиксирует контекст исключения на языковой границе и в потоках.

Синтаксис

HRESULT CapturePropagationContext(
  [in] IUnknown *languageException
);

Параметры

[in] languageException

Объект ошибки, который является гибким, in-proc и маршалирован по значению между процессами.

Возвращаемое значение

Если этот метод завершается успешно, он возвращает 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
Header restrictederrorinfo.h

См. также раздел

ILanguageExceptionErrorInfo2