2016-09-26 11 views
1

Octokit.net을 통해 Github API로 작업하고 있습니다. 이제 TwoFactorAuth를 담당하는 코드를 작성하고 있습니다. 토큰에 대한 요청을 보낼 때 2FA 계정 인 경우 "TwoFactorRequiredException"을 가져야합니다. 나는 그것을 잡으려고 노력하고 있지만 그것의 인스턴스는 "AggregateException"을 얻는다. 하지만 Agg ..Exc의 InnerExceptions를 살펴보면 단 하나 뿐이며 "TwoFactorRequiredException"입니다. 다음은 내 코드입니다 :이상한 try/catch 블록 동작

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()); 
// } 
//} 

이 주석 때, 나는 그것이 주석 때, 그때 나는 AggExc이 있고 그 안에 내가 TwoFactor..Exception을 가지고 AggregateExceptions 있습니다.

답변

3

client.Authorization.Create(newAuthorization)Task<T>을 반환하기 때문입니다. 여기서 T이 결과 유형입니다. Task에는 여러 예외가 발생할 수 있으므로 Task Parallel Library은 모든 예외를 캡처하는 AggregateException을 반환합니다.

비동기 메서드에서 동기식으로 블로킹하는 대신 비동기식으로 완료 될 때까지 대기하는 await을 사용해야합니다. 당신은 이걸로 두 가지를 얻습니다. 첫 번째는 동 기적으로 차단하지 않는다는 것입니다 및 스레드를 확보 할 수 있습니다, 두 번째는 await 당신의 예외 펼쳤다이다 : 나는 NavigateAsync가 무엇을 잘 모르겠어요하지만

public async Task<Token> CallSomethingAsync() 
{ 
    try 
    { 
     var result = await client.Authorization.Create(newAuthorization); 
     result.Token; 
    } 
    catch (Octokit.TwoFactorRequiredException) 
    { 
     _navigationService.NavigateAsync($"{nameof(TwoFactorAuthPage)}", animated: false); 
    } 
} 

, 당신도 할 수있다 생각을 완료를 기다리고 싶습니다.

+0

빠른 응답을 부탁드립니다. –

+0

@ юрійбабій 당신을 환영합니다. –

+0

@ Yuval Itzchakov하지만 비동기 실행이 필요하지 않은 경우 Aggregate Ex를 잡아도 괜찮습니까? 블록에서 2FA를 포함하고 있는지 확인하십시오. –