내 응용 프로그램에서 사용자가 로그인을 시도합니다. 때로는 자격 증명이 맞더라도 웹 사이트에서 로그인이 실패하고 사용자에게 보안 문자 코드를 입력하도록 요청하는 경우가 있습니다. 그들이 로그인을 두 번 시도해야한다는 것을 의미합니다.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);
:
캐치 외부에서 처리합니까? – Joe
추가하는 것을 잊어 버렸습니다. 나는 Clean Code라고 불리는 책에서 가르쳐지는 많은 관습들을 따르고있다. 저자는 가능한 경우 try/catch 블록이 함수에서 사용될 때 try/catch 블록 전후에 아무 것도 나타나지 않아야한다고 명시합니다. 나는 함수를 작게 유지하기 위해 좋은 디자인 관례를 따르고있다 (아직 리팩터링해야한다). 내가 찾은 해결책 중 그다지 고려하지 않은 것이 있습니다. –
@JamesJeffery 비동기 코드에 대한 관례를 비동기 코드에 적용하는 것이 항상 성공적이지는 않습니다. 'await'은 훨씬 더 비슷하게 보일 수 있지만, 차이점은 있고, 코딩 관행에 적어도 약간의 영향을 줄 필요가 있습니다. – Servy