Partager via


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

Capture le contexte d’une exception au-delà d’une limite de langage et de threads.

Syntaxe

HRESULT CapturePropagationContext(
  [in] IUnknown *languageException
);

Paramètres

[in] languageException

Objet d’erreur qui est apartment-agile, in-proc et marshal-by-value entre les processus.

Valeur retournée

Si cette méthode réussit, elle retourne S_OK. Sinon, elle retourne un code d’erreur HRESULT.

Remarques

CapturePropagationContext est utilisé par une projection de langage lors de la nouvelle levée d’une erreur. Cela inclut lorsqu’une erreur est reçue au niveau d’une limite de langue. Par conséquent, l’utilisation de CapturePropagationContext permet de garantir que la trace arrière d’une exception est capturée pour une nouvelle levée actuelle. Cela permet également de garantir que les informations de débogage pertinentes ne sont pas perdues lorsqu’une exception traverse une frontière linguistique.

En règle générale, la méthode crée une liste liée d’objets IRestrictedErrorInfo qui fournissent des informations d’erreur supplémentaires sur la façon dont l’exception s’est propagée. Ces informations sont exposées sous forme d’exceptions rangées référencées par l’enregistrement d’exception pendant l’analyse du vidage sur incident. À l’aide de cette liste liée, vous pouvez observer la trace d’arrière pour toutes les limites et threads de langue par lesquels l’exception s’est propagée, y compris l’origine de l’erreur.

Exemples

L’exemple suivant illustre la projection recevant une erreur à sa limite de langue à partir d’une autre projection ou WRL. Il s’agit d’un scénario existant, mais permet au système de capturer un contexte supplémentaire si la projection précédente n’a pas pu le faire.

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


Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 10, version 1703 [applications de bureau uniquement]
Serveur minimal pris en charge Windows Server 2016 (applications de bureau uniquement)
Plateforme cible Windows
En-tête restrictederrorinfo.h

Voir aussi

ILanguageExceptionErrorInfo2