Как программно перевести IAsyncOperation в состояние ошибки? - PullRequest
1 голос
/ 31 января 2020

У меня есть некоторый код 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"";
}

1 Ответ

1 голос
/ 31 января 2020

Вы должны выбросить исключение winrt::xxx или std::xxx. Это будет поймано на границе сопрограммы и возвращено через ABI в проекцию языка вызова, которая обычно перебрасывает исключение. Это специально разработано для работы на разных языках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...