Freigeben über


ILanguageExceptionErrorInfo2::CapturePropagationContext-Methode (restrictederrorinfo.h)

Erfasst den Kontext einer Ausnahme über eine Sprachgrenze und threadsübergreifend.

Syntax

HRESULT CapturePropagationContext(
  [in] IUnknown *languageException
);

Parameter

[in] languageException

Ein Fehlerobjekt, das prozessübergreifend apartment-agile, in-proc und marshall-by-value ist.

Rückgabewert

Wenn diese Methode erfolgreich ist, wird S_OK zurückgegeben. Andernfalls wird ein Fehlercode HRESULT zurückgegeben.

Hinweise

CapturePropagationContext wird von einer Sprachprojektion beim erneuten Auslösen eines Fehlers verwendet. Dies schließt ein, wenn ein Fehler an einer Sprachgrenze empfangen wird. Daher trägt die Verwendung von CapturePropagationContext dazu bei, dass die Rückverfolgung für eine Ausnahme für einen aktuellen erneuten Aufruf erfasst wird. Dies soll auch dazu beitragen, dass relevante Debuginformationen nicht verloren gehen, wenn eine Ausnahme einen Sprachrahmen überschreitet.

Im Allgemeinen erstellt die -Methode eine verknüpfte Liste von IRestrictedErrorInfo-Objekten , die zusätzliche Fehlerinformationen zur Weitergabe der Ausnahme bereitstellen. Diese Informationen werden als verstaute Ausnahmen verfügbar gemacht, auf die der Ausnahmedatensatz während der Absturzabbildanalyse verweist. Mithilfe dieser verknüpften Liste können Sie die Rückverfolgung für alle Sprachgrenzen und Threads beobachten, über die die Ausnahme weitergegeben wurde, einschließlich der Herkunft des Fehlers.

Beispiele

Im folgenden Beispiel wird die Projektion veranschaulicht, die an ihrer Sprachgrenze einen Fehler von einer anderen Projektion oder WRL empfängt. Dies ist ein vorhandenes Szenario, ermöglicht es dem System jedoch, zusätzlichen Kontext zu erfassen, wenn dies bei der vorherigen Projektion nicht möglich war.

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


Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 10, Version 1703 [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2016 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile restrictederrorinfo.h

Weitere Informationen

ILanguageExceptionErrorInfo2