ILanguageExceptionErrorInfo2
COM公式ドキュメント
ILanguageExceptionErrorInfo と同様に、言語プロジェクションがエラー情報を提供および取得できるようにします。さらに、言語の境界をまたいで動作するという利点があります。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
1 つ前の言語例外エラー情報オブジェクトを取得します。
| previousLanguageExceptionErrorInfo | ILanguageExceptionErrorInfo2** | out | 1 つ前のエラー情報オブジェクトを格納する ILanguageExceptionErrorInfo2 オブジェクトへのポインター。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
一般的には、対象の例外に関する追加のエラー情報を保持する IRestrictedErrorInfo オブジェクトの連結リストを取得するために GetPropagationContextHead を使用します。その後、GetPreviousLanguageExceptionErrorInfo を使用してその連結リストをたどり、各エラーを個別に調べることができます。
オペレーティングシステムも、このメソッドを使用してエラーに関連付けられた保存済みの例外 (stowed exception) を取得します。
言語の境界およびスレッドをまたいで、例外のコンテキストをキャプチャします。
| languageException | IUnknown* | in | アパートメントアジャイルで、プロセス内で動作し、プロセス間では値渡し (marshal-by-value) でマーシャリングされるエラーオブジェクト。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
CapturePropagationContext は、言語プロジェクションがエラーを再スローする際に使用されます。これには、言語の境界でエラーを受け取った場合も含まれます。そのため、CapturePropagationContext を使用することで、現在の再スローに対する例外のバックトレースが確実にキャプチャされます。これは、例外が言語の境界を越える際に、関連するデバッグ情報が失われないようにするためでもあります。
一般的に、このメソッドは、例外がどのように伝播したかに関する追加のエラー情報を提供する IRestrictedErrorInfo オブジェクトの連結リストを作成します。この情報は、クラッシュダンプ解析時に例外レコードから参照される保存済みの例外 (stowed exception) として公開されます。この連結リストを使用すると、例外が伝播したすべての言語境界とスレッドのバックトレース (エラーの発生元を含む) を確認できます。
例
次の例は、プロジェクションが自身の言語境界において、別のプロジェクションまたは WRL からエラーを受け取る様子を示しています。これは既存のシナリオですが、前のプロジェクションが追加のコンテキストをキャプチャできなかった場合でも、システムがそれをキャプチャできるようにします。
HRESULT CreateFooExceptionFromLanguageBoundaryError(HRESULT errorReceived, IFooException** createdException)
{
HRESULT hr = S_OK;
ComPtr<IFooException> exception;
// 現在のエラーを取得する
ComPtr<IRestrictedErrorInfo> restrictedErrorInfo;
*createdException = nullptr;
if (SUCCEEDED(GetRestrictedErrorInfo(&restrictedErrorInfo)))
{
// エラーの詳細を取得し、それが古い (stale) エラーなのか、
// それとも境界で受け取ったエラーなのかを判断する。
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);
// 新しいインターフェイスをクエリし、現在の伝播コンテキストを
// キャプチャするためのロジックが存在するかどうかを確認する。
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);
}
// エラーが一致しなかった場合、またはエラーの詳細を取得できなかった場合はここに到達する。
// その場合は新しいエラーを発生 (originate) させる。
// OriginateErrorInfoForThrow は RoOriginateLanguageException を呼び出し、
// それによってコンテキストがキャプチャされる。
hr = CreateFooException(errorReceived, nullptr, nullptr, &exception);
if(SUCCEEDED(hr))
{
exception->OriginateErrorInfoForThrow();
*createdException = exception.Detach();
}
return hr;
}
伝播コンテキストの先頭を取得します。
| propagatedLanguageExceptionErrorInfoHead | ILanguageExceptionErrorInfo2** | out | 成功した場合、伝播コンテキストの先頭を表す ILanguageExceptionErrorInfo2 オブジェクトを返します。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
GetPropagationContextHead を使用すると、対象の例外に関する追加のエラー情報を保持する IRestrictedErrorInfo オブジェクトの連結リストを取得できます。その後、GetPreviousLanguageExceptionErrorInfo を使用してその連結リストをたどり、各エラーを個別に調べることができます。
オペレーティングシステムも、このメソッドを使用してエラーに関連付けられた保存済みの例外 (stowed exception) を取得します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_ILanguageExceptionErrorInfo2 "{5746E5C4-5B97-424C-B620-2822915734DD}"
#usecom global ILanguageExceptionErrorInfo2 IID_ILanguageExceptionErrorInfo2 "{}"
#comfunc global ILanguageExceptionErrorInfo2_GetPreviousLanguageExceptionErrorInfo 4 sptr
#comfunc global ILanguageExceptionErrorInfo2_CapturePropagationContext 5 sptr
#comfunc global ILanguageExceptionErrorInfo2_GetPropagationContextHead 6 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。