奇怪的 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 做了什么,但我想你可能也想等待它的完成。