Compartir a través de


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

Consulte también

ILanguageExceptionErrorInfo2