2016-09-26 3 views
1

Я работаю с API Github через Octokit.net. Теперь я пишу код, отвечающий за TwoFactorAuth. Когда я отправляю запрос на токен, если он является учетной записью 2FA, я должен получить «TwoFactorRequiredException». Я пытаюсь поймать его, но insteand этого я получаю «AggregateException». Но когда я смотрю в InnerExceptions of Agg..Exc .., то у меня есть только один, и это «TwoFactorRequiredException». Вот мой код:Странное поведение try/catch block

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.

ответ

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 делает, я думаю, вы можете также хочу дождаться, когда это будет завершено.

+0

Благодарим за быстрый ответ. –

+0

@ юрійбабій Добро пожаловать. –

+0

@ Юваль Ицчаков. Но если мне не нужно выполнение асинхронного вызова, может быть, это просто отлично, чтобы поймать Aggregate Ex и в нем заблокировать его, чтобы он содержал 2FA ex? –

Смежные вопросы