簡體   English   中英

異步異常未捕獲

[英]async Exception not being caught

我有一個Windows服務,引用以下代碼。 我的使用以下方法的代碼包含一個try..catch塊,但似乎沒有catch在以下方法中thrown RefereshTokenException 顯然,我對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();
}

這是一個async void 避免使用異步void方法的主要原因之一是您無法處理它們引發的異常。

將其設為async Task ,然后在調用await它。

請注意,然后在該調用async void Process(...)存在相同的問題, async void Process(...)

也將其設為async Task ,然后async Task 從GUI或Controller到異步I / O調用,異步/等待應該形成一個鏈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM