2013-12-11 2 views
0

내 응용 프로그램에서 사용자가 로그인을 시도합니다. 때로는 자격 증명이 맞더라도 웹 사이트에서 로그인이 실패하고 사용자에게 보안 문자 코드를 입력하도록 요청하는 경우가 있습니다. 그들이 로그인을 두 번 시도해야한다는 것을 의미합니다.catch 블록에서 대기 중 사용하기

내 응용 프로그램에는 로그인 실패 또는 웹 사이트에서 사용자에게 captcha 입력을 요청할 때 throw되는 2 개의 사용자 정의 예외가 있습니다. 여기에 그들은 다음과 같습니다 :

class LoginFailedException : Exception 
{ 
    public LoginFailedException() { } 
    public LoginFailedException(string message) : base(message) { } 
} 

class LoginFailedCaptchaRequiredException : Exception 
{ 
    public LoginFailedCaptchaRequiredException() { } 
    public LoginFailedCaptchaRequiredException(string message) : base(message) { } 
} 

내 응용 프로그램에서 나는이 두 예외를 모두 포착합니다. LoginFailedCaptchaRequiredException이 던져지면 나는 그것을 잡았지만 captcha 이미지로 텍스트를 입력하라는 대화 상자를 사용자에게 제시해야합니다. 일단 그들이 텍스트를 입력하면 나는 'LoginWithCaptcha 기다리기'를 부를 필요가있다.

그러나 문제는 catch 안에 await을 사용할 수 없다는 것입니다. 대체 솔루션은 무엇입니까?

private async void btnLogin_Click(object sender, EventArgs e) 
{ 
     try 
     { 
      webclient = new WebsiteAPI("username", "password"); 
      await webclient.Login(); 
      MessageBox.Show("Logged In"); 
     } 
     catch (LoginFailedException ex) 
     { 
      MessageBox.Show("Login Failed"); 
     } 
     catch (LoginFailedCaptchaRequiredException ex) 
     { 
      // 1. Show dialog with Captcha 
      // 2. Get captcha text entered by user 
      // 3. await LoginWithCaptcha(string captchaText, string captchaKey); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Something Bad Happened"); 
     } 
    } 

가 어떻게이 문제를 해결 얻을 수 있습니다 :

그리고 여기 내 로그인 버튼입니까? 당신은 다음 무엇을해야하는지에 관해서는 더 복잡한 의사 결정이있는 경우

bool tryToLoginWithCaptcha = false; 

try 
{ 
    //... 
} 
catch (LoginFailedCaptchaRequiredException ex) 
{ 
    // 1. Show dialog with Captcha 
    // 2. Get captcha text entered by user 
    tryToLoginWithCaptcha = true; 
} 

if(tryToLoginWithCaptcha) 
    await LoginWithCaptcha(captchaText, captchaKey); 

:

+1

캐치 외부에서 처리합니까? – Joe

+0

추가하는 것을 잊어 버렸습니다. 나는 Clean Code라고 불리는 책에서 가르쳐지는 많은 관습들을 따르고있다. 저자는 가능한 경우 try/catch 블록이 함수에서 사용될 때 try/catch 블록 전후에 아무 것도 나타나지 않아야한다고 명시합니다. 나는 함수를 작게 유지하기 위해 좋은 디자인 관례를 따르고있다 (아직 리팩터링해야한다). 내가 찾은 해결책 중 그다지 고려하지 않은 것이 있습니다. –

+0

@JamesJeffery 비동기 코드에 대한 관례를 비동기 코드에 적용하는 것이 항상 성공적이지는 않습니다. 'await'은 훨씬 더 비슷하게 보일 수 있지만, 차이점은 있고, 코딩 관행에 적어도 약간의 영향을 줄 필요가 있습니다. – Servy

답변

0

은 단순히 당신이 할 수있는 몇 가지 작업을 나타냅니다, 다음 전체 try/finally 종료 후 그것을 수행 catch 블록을 가지고 물론 부울 대신 List<Task>에서 await까지 지정할 수 있습니다.

관련 문제