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 |