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 |