为了账号安全,请及时绑定邮箱和手机立即绑定

未捕获异步异常

未捕获异步异常

C#
Qyouu 2021-06-22 16:00:18
我有一个引用以下代码的 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);    }}这是调用的代码 RefreshTokenspublic 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 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

这是一个async void. 避免异步 void 方法的主要原因之一是您无法处理它们抛出的异常。

在调用者中使它成为一个async Taskawait它。

请注意,您随后在该呼叫者中遇到了相同的问题, async void Process(...)

把它做好,然后async Task按照自己的方式工作。async/await 应该形成一个链,从您的 GUI 或控制器到异步 I/O 调用。


查看完整回答
反对 回复 2021-06-26
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信