1

我正在通过 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。

4

1 回答 1

3

那是因为client.Authorization.Create(newAuthorization)返回 a Task<T>T你的结果类型在哪里。在 aTask中,可能会发生多个异常,这就是任务并行库返回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,但我认为您可能还想等待它的完成。

于 2016-09-26T11:46:39.463 回答