次の方法で共有


ILanguageExceptionErrorInfo2::CapturePropagationContext メソッド (restrictederrorinfo.h)

言語境界を越えてスレッド間で例外のコンテキストをキャプチャします。

構文

HRESULT CapturePropagationContext(
  [in] IUnknown *languageException
);

パラメーター

[in] languageException

プロセス間でアパートメント アジャイル、インプロセス、マーシャリングバイバリューのエラー オブジェクト。

戻り値

このメソッドは、成功すると S_OK を返します。 そうでない場合は、HRESULT エラー コードを返します。

注釈

CapturePropagationContext は、エラーの再スロー時に言語プロジェクションによって利用されます。 これには、言語境界でエラーが発生した場合が含まれます。 そのため、 CapturePropagationContext を使用すると、例外のバック トレースが現在の再スローに対して確実にキャプチャされます。 これは、例外が言語境界を越えたときに、関連するデバッグ情報が失われるのを確実にするのにも役立ちます。

一般に、 メソッドは IRestrictedErrorInfo オブジェクトのリンクされたリストを作成し、例外の伝達方法に関する追加のエラー情報を提供します。 この情報は、クラッシュ ダンプ分析中に例外レコードによって参照される積み込み例外として公開されます。 このリンク リストを使用すると、エラーの発生元を含め、例外が伝達されたすべての言語境界とスレッドのバック トレースを確認できます。

次の例では、別のプロジェクションまたは WRL から言語境界でエラーを受け取るプロジェクションを示します。 これは既存のシナリオですが、前のプロジェクションでこれを行うことができなかった場合、システムは追加のコンテキストをキャプチャできます。

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


要件

要件
サポートされている最小のクライアント Windows 10、バージョン 1703 [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2016 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー restrictederrorinfo.h

こちらもご覧ください

ILanguageExceptionErrorInfo2