Async Exception не быть пойманным - PullRequest
0 голосов
/ 23 мая 2018

У меня есть служба Windows, которая ссылается на следующий код.Мой код, который использует приведенный ниже метод, содержит блок try..catch, но он не выглядит как catch RefereshTokenException, то есть thrown в приведенном ниже методе.Очевидно, мое понимание async неверно.

private async void RefreshTokens()
{
    try
    {
        var cognito = new CognitoApi();
        var response = cognito.TokenRefresh(_refreshToken);

        if (response.HttpStatusCode == HttpStatusCode.OK)
        {
            _idToken = new AwsToken(response.AuthenticationResult.IdToken);
            _accessToken = new AwsToken(response.AuthenticationResult.AccessToken);
        }
        else
        {
            await _signIn(_credentials.SiteId, _credentials.LocationId, null);
        }
    }
    catch (NotAuthorizedException)
    {
        await _signIn(_credentials.SiteId, _credentials.LocationId, null);
    }
    catch (Exception ex)
    {
        throw new RefreshTokenException("Failed refreshing tokens.", ex);
    }
}

Это код, который вызывает RefreshTokens

public async void Process(QueueMessage queueMessage, Action<QueueMessage> retryAction)
{
    _processingCounter.Increment();

    try
    {
        ......
        IAwsToken idToken = authenticationService.Tokens.IdToken; //This is the code that calls "RefreshTokens" method
        ........
    }
    catch (Exception ex)
    {
        //Code never reaches here...
        _logger.Error("Error in ProcessMessage", ex);
    }

    _processingCounter.Decrement();
}

1 Ответ

0 голосов
/ 23 мая 2018

Это async void.Одна из главных причин избегать асинхронных void-методов заключается в том, что вы не можете обрабатывать исключения, которые они генерируют.

Сделайте это async Task и await в звонящем.

Обратите внимание, что у вас возникла та же проблема с этим абонентом: async void Process(...)

Сделайте это async Task и продолжайте свой путь вверх.async / await должен образовывать цепочку от вашего графического интерфейса или контроллера до асинхронного вызова ввода-вывода.

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