奇怪的 try/catch 块行为
Strange try/catch block behavior
我通过 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)
returns a Task<T>
,其中 T
是您的结果类型。在 Task
中,可能会发生多个异常,这就是为什么 Task Parallel Library returns 和 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
做了什么,但我想你可能也想等待它的完成。
我通过 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)
returns a Task<T>
,其中 T
是您的结果类型。在 Task
中,可能会发生多个异常,这就是为什么 Task Parallel Library returns 和 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
做了什么,但我想你可能也想等待它的完成。