【问题标题】:Strange try/catch block behavior奇怪的 try/catch 块行为
【发布时间】:2023-04-09 14:03:01
【问题描述】:

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

【问题讨论】:

    标签: c# exception github aggregateexception octokit.net


    【解决方案1】:

    这是因为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 做了什么,但我想你可能还想等待它完成。

    【讨论】:

    • 感谢您的快速回复。
    • @ Yuval Itzchakov 但是如果我不需要异步执行,捕获 Aggregate Ex 并在其中块检查它是否包含 2FA ex 可以吗?
    • @юрійбабій 您可以捕获AggregateException 并迭代它的内部异常。请注意,异步方法 can lead to deadlocks 上的同步阻塞,所以你应该小心。
    猜你喜欢
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多