奇怪的try/catch块行为
本文关键字:catch try | 更新日期: 2023-09-27 18:08:54
我正在通过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
这是因为client.Authorization.Create(newAuthorization)
返回Task<T>
,其中T
是您的结果类型。在Task
内部,可以发生多个异常,这就是任务并行库返回捕获所有异常的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
做什么,我认为你可能也想等待它的完成