如何以编程方式强制 IAsyncOperation 进入错误状态?
How can I programmatically force an IAsyncOperation into the error state?
我有一些异步 returns 字符串的 C++/WinRT 代码。但是,一些内部操作可能会失败,当失败时,我需要让 IAsyncOperation 也进入错误状态。 co_return
显然将操作移至完成状态;如何将操作移至错误状态?精简代码如下:
winrt::IAsyncOperation<winrt::hstring> MyClass::DoAuthenticationAsync()
{
auto acctProvider = co_await winrt::WebAuthenticationCoreManager::FindAccountProviderAsync(AccountProviderId, authority, user);
auto webToken = winrt::WebTokenRequest(acctProvider, CarbonScope, CarbonClientId, winrt::WebTokenRequestPromptType::Default);
webToken.Properties().Insert(L"authority", authority);
webToken.Properties().Insert(L"resource", resource);
auto requestResult = co_await winrt::WebAuthenticationCoreManager::GetTokenSilentlyAsync(webToken);
auto requestStatus = requestResult.ResponseStatus();
if (requestStatus == winrt::WebTokenRequestStatus::Success)
{
co_return requestResult.ResponseData().GetAt(0).Token();
}
else if (requestStatus == winrt::WebTokenRequestStatus::UserInteractionRequired)
{
auto uxresult = co_await winrt::WebAuthenticationCoreManager::RequestTokenAsync(webToken);
requestStatus = uxresult.ResponseStatus();
if (requestStatus == winrt::WebTokenRequestStatus::Success)
{
co_return uxresult.ResponseData().GetAt(0).Token();
}
}
if (requestStatus == winrt::WebTokenRequestStatus::ProviderError)
{
// here I'd like to have the IAsyncOperation have an Error status with the ErrorCode from the requestResult.
auto err = requestResult.ResponseError().ErrorCode();
}
co_return L"";
}
您必须抛出 winrt::xxx
或 std::xxx
异常。这将在协程边界被捕获并通过 ABI 返回到调用语言投影,这通常会重新抛出异常。这是专门为跨语言工作而设计的。
我有一些异步 returns 字符串的 C++/WinRT 代码。但是,一些内部操作可能会失败,当失败时,我需要让 IAsyncOperation 也进入错误状态。 co_return
显然将操作移至完成状态;如何将操作移至错误状态?精简代码如下:
winrt::IAsyncOperation<winrt::hstring> MyClass::DoAuthenticationAsync()
{
auto acctProvider = co_await winrt::WebAuthenticationCoreManager::FindAccountProviderAsync(AccountProviderId, authority, user);
auto webToken = winrt::WebTokenRequest(acctProvider, CarbonScope, CarbonClientId, winrt::WebTokenRequestPromptType::Default);
webToken.Properties().Insert(L"authority", authority);
webToken.Properties().Insert(L"resource", resource);
auto requestResult = co_await winrt::WebAuthenticationCoreManager::GetTokenSilentlyAsync(webToken);
auto requestStatus = requestResult.ResponseStatus();
if (requestStatus == winrt::WebTokenRequestStatus::Success)
{
co_return requestResult.ResponseData().GetAt(0).Token();
}
else if (requestStatus == winrt::WebTokenRequestStatus::UserInteractionRequired)
{
auto uxresult = co_await winrt::WebAuthenticationCoreManager::RequestTokenAsync(webToken);
requestStatus = uxresult.ResponseStatus();
if (requestStatus == winrt::WebTokenRequestStatus::Success)
{
co_return uxresult.ResponseData().GetAt(0).Token();
}
}
if (requestStatus == winrt::WebTokenRequestStatus::ProviderError)
{
// here I'd like to have the IAsyncOperation have an Error status with the ErrorCode from the requestResult.
auto err = requestResult.ResponseError().ErrorCode();
}
co_return L"";
}
您必须抛出 winrt::xxx
或 std::xxx
异常。这将在协程边界被捕获并通过 ABI 返回到调用语言投影,这通常会重新抛出异常。这是专门为跨语言工作而设计的。