奇怪的尝试/捕获块行为

时间:2016-09-26 11:44:23

标签: c# exception github aggregateexception octokit.net

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

1 个答案:

答案 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的作用,但我认为您也可能希望等待它完成。