Metodo ILanguageExceptionErrorInfo2::CapturePropagationContext (restrictederrorinfo.h)
Acquisisce il contesto di un'eccezione attraverso un limite linguistico e tra thread.
Sintassi
HRESULT CapturePropagationContext(
[in] IUnknown *languageException
);
Parametri
[in] languageException
Oggetto errore che è apartment-agile, in-proc e marshallal-by-value tra processi.
Valore restituito
Se questo metodo ha esito positivo, restituisce S_OK. In caso contrario, restituisce un codice di errore HRESULT .
Commenti
CapturePropagationContext viene usato da una proiezione del linguaggio in caso di re-generate di un errore. Ciò include quando viene ricevuto un errore in corrispondenza di un limite linguistico. Di conseguenza, l'uso di CapturePropagationContext consente di assicurarsi che la traccia indietro per un'eccezione venga acquisita per un re-throw corrente. Ciò consente inoltre di garantire che le informazioni di debug pertinenti non vengano perse quando un'eccezione attraversa un bordo del linguaggio.
In genere, il metodo crea un elenco collegato di oggetti IRestrictedErrorInfo che forniscono informazioni aggiuntive sugli errori relativi alla propagazione dell'eccezione. Queste informazioni vengono esposte come eccezioni stowed a cui fa riferimento il record di eccezione durante l'analisi del dump di arresto anomalo. Usando questo elenco collegato, è possibile osservare la traccia indietro per tutti i limiti e i thread di lingua propagati dall'eccezione, inclusa la posizione in cui è stato generato l'errore.
Esempio
Nell'esempio seguente viene illustrata la proiezione che riceve un errore al limite della lingua da un'altra proiezione o WRL. Si tratta di uno scenario esistente, ma consente al sistema di acquisire un contesto aggiuntivo se la proiezione precedente non è riuscita a farlo.
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;
}
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 10 versione 1703 [solo app desktop] |
Server minimo supportato | Windows Server 2016 [solo app desktop] |
Piattaforma di destinazione | Windows |
Intestazione | restrictederrorinfo.h |