奇怪的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

奇怪的try/catch块行为

这是因为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做什么,我认为你可能也想等待它的完成