Compartilhar via


Método ILanguageExceptionErrorInfo2::CapturePropagationContext (restrictederrorinfo.h)

Captura o contexto de uma exceção em um limite de idioma e entre threads.

Sintaxe

HRESULT CapturePropagationContext(
  [in] IUnknown *languageException
);

Parâmetros

[in] languageException

Um objeto de erro que é apartment-agile, in-proc e marshal-by-value entre processos.

Retornar valor

Se o método for bem-sucedido, ele retornará S_OK. Caso contrário, ele retornará um código de erro HRESULT.

Comentários

CapturePropagationContext é utilizado por uma projeção de linguagem no relançamento de um erro. Isso inclui quando um erro é recebido em um limite de idioma. Dessa forma, utilizar CapturePropagationContext ajuda a garantir que o rastreamento traseiro de uma exceção seja capturado para um relançamento atual. Isso também ajuda a garantir que as informações relevantes de depuração não sejam perdidas quando uma exceção cruza uma borda de idioma.

Em geral, o método cria uma lista vinculada de objetos IRestrictedErrorInfo que fornecem informações de erro adicionais sobre como a exceção foi propagada. Essas informações são expostas como exceções restritas referenciadas pelo registro de exceção durante a análise de despejo de memória. Usando essa lista vinculada, você pode observar o rastreamento de back para todos os limites de linguagem e threads pelos quais a exceção se propagava, incluindo de onde o erro se originou.

Exemplos

O exemplo a seguir demonstra a projeção recebendo um erro em seu limite de linguagem de outra projeção ou WRL. Esse é um cenário existente, mas permite que o sistema capture contexto adicional se a projeção anterior não puder fazer isso.

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;
}


Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 10, versão 1703 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2016 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho restrictederrorinfo.h

Confira também

ILanguageExceptionErrorInfo2