[英]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.