我正在通过Octokit.net使用Github API。现在我正在编写负责TwoFactorAuth的代码。当我发送令牌请求时,如果它是2FA帐户,那么我必须得到“TwoFactorRequiredException”。我试图抓住它,但它的内容我得到“AggregateException”。但是当我查看Agg..Exc的InnerExceptions时,我只有一个,它是“TwoFactorRequiredException”。 这是我的代码:
try
{
return client.Authorization.Create(newAuthorization).Result.Token;
}
catch ( Octokit.TwoFactorRequiredException )
{
_navigationService.NavigateAsync($"{nameof(TwoFactorAuthPage)}", animated: false);
}
//catch ( AggregateException ex )
//{
// foreach ( var exception in ex.InnerExceptions )
// {
// Debug.WriteLine(exception.GetType());
// }
//}
当它被评论时,我有AggregateExceptions,当它被取消注释时,我有AggExc并且在其中我有TwoFactor..Exception。
答案 0 :(得分:3)
这是因为client.Authorization.Create(newAuthorization)
返回Task<T>
,其中T
是您的结果类型。在Task
内,可能会发生多个异常,这就是Task Parallel Library返回捕获所有异常的AggregateException
的原因。
不是在异步方法上同步阻塞,而是应该await
,异步等待它完成。你从中获得了两件事。第一个是你没有同步阻止并且可以释放线程,第二个是await
为你解开例外:
public async Task<Token> CallSomethingAsync()
{
try
{
var result = await client.Authorization.Create(newAuthorization);
result.Token;
}
catch ( Octokit.TwoFactorRequiredException )
{
_navigationService.NavigateAsync($"{nameof(TwoFactorAuthPage)}", animated: false);
}
}
虽然我不确定NavigateAsync
的作用,但我认为您也可能希望等待它完成。