Método ILanguageExceptionErrorInfo2::CapturePropagationContext (restrictederrorinfo.h)
Captura el contexto de una excepción a través de un límite de idioma y entre subprocesos.
Sintaxis
HRESULT CapturePropagationContext(
[in] IUnknown *languageException
);
Parámetros
[in] languageException
Objeto de error que es apartment-agile, in-proc y serializar por valor entre procesos.
Valor devuelto
Si este método se realiza correctamente, devuelve S_OK. De lo contrario, devuelve un código de error de HRESULT.
Comentarios
CapturePropagationContext se utiliza mediante una proyección de lenguaje al volver a producir un error. Esto incluye cuando se recibe un error en un límite de idioma. Por lo tanto, el uso de CapturePropagationContext ayuda a garantizar que el seguimiento de retroceso de una excepción se capture para un nuevo lanzamiento actual. Esto también ayuda a garantizar que la información de depuración pertinente no se pierda cuando una excepción cruza un borde de idioma.
Por lo general, el método crea una lista vinculada de objetos IRestrictedErrorInfo que proporcionan información de error adicional sobre cómo se propaga la excepción. Esta información se expone como excepciones permitidas a las que hace referencia el registro de excepciones durante el análisis del volcado de memoria. Con esta lista vinculada, puede observar el seguimiento posterior de todos los límites de idioma y subprocesos a los que se propagó la excepción, incluido dónde se originó el error.
Ejemplos
En el ejemplo siguiente se muestra la proyección que recibe un error en su límite de lenguaje desde otra proyección o WRL. Se trata de un escenario existente, pero permite al sistema capturar contexto adicional si la proyección anterior no pudo hacerlo.
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 | Value |
---|---|
Cliente mínimo compatible | Windows 10, versión 1703 [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2016 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | restrictederrorinfo.h |