Metode ILanguageExceptionErrorInfo2::CapturePropagationContext (restrictederrorinfo.h)

Menangkap konteks pengecualian di seluruh batas bahasa dan di seluruh utas.

Sintaks

HRESULT CapturePropagationContext(
  [in] IUnknown *languageException
);

Parameter

[in] languageException

Objek kesalahan yang tangkas apartemen, in-proc, dan marshal-by-value di seluruh proses.

Nilai kembali

Jika metode ini berhasil, metode ini mengembalikan S_OK. Jika tidak, kode kesalahan HRESULT akan dikembalikan.

Keterangan

CapturePropagationContext digunakan oleh proyeksi bahasa saat melempar ulang kesalahan. Ini termasuk ketika kesalahan diterima pada batas bahasa. Dengan demikian, menggunakan CapturePropagationContext membantu memastikan bahwa jejak belakang untuk pengecualian diambil untuk pelemparan ulang saat ini. Ini juga untuk membantu memastikan bahwa informasi penelusuran kesalahan yang relevan tidak hilang ketika pengecualian melewati batas bahasa.

Secara umum, metode ini membuat daftar objek IRestrictedErrorInfo yang ditautkan yang memberikan informasi kesalahan tambahan mengenai bagaimana pengecualian disebarluaskan. Informasi ini diekspos sebagai pengecualian yang disematkan yang direferensikan oleh rekaman pengecualian selama analisis crash dump. Dengan menggunakan daftar tertaut ini, Anda dapat mengamati jejak belakang untuk semua batas bahasa dan utas yang disebarluaskan pengecualian, termasuk dari mana kesalahan berasal.

Contoh

Contoh berikut menunjukkan proyeksi menerima kesalahan pada batas bahasanya dari proyeksi lain atau WRL. Ini adalah skenario yang ada, tetapi memungkinkan sistem untuk menangkap konteks tambahan jika proyeksi sebelumnya tidak dapat melakukannya.

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


Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 10, versi 1703 [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2016 [hanya aplikasi desktop]
Target Platform Windows
Header restrictederrorinfo.h

Lihat juga

ILanguageExceptionErrorInfo2