在我的应用程序中,用户尝试登录。有时网站将无法登录 - 即使凭据正确 - 并要求用户输入验证码。这意味着他们必须尝试两次登录。
我的应用程序有2个自定义异常,无论是登录失败还是网站要求用户输入验证码。他们在这里:
class LoginFailedException : Exception
{
public LoginFailedException() { }
public LoginFailedException(string message) : base(message) { }
}
class LoginFailedCaptchaRequiredException : Exception
{
public LoginFailedCaptchaRequiredException() { }
public LoginFailedCaptchaRequiredException(string message) : base(message) { }
}
在我的应用程序中,我捕获了这两个异常。当抛出LoginFailedCaptchaRequiredException
时,我会抓住它,但我需要使用验证码图像向用户显示一个对话框,要求他们从验证码图像中输入文本。一旦他们输入了文本,我就需要调用'await LoginWithCaptcha'。
但问题是我无法在await
内使用catch
。我可以在这里尝试哪些替代解决方案?
这是我的登录按钮:
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");
}
}
我怎样才能解决这个问题?
答案 0 :(得分:0)
让catch
块只是表明你有一些工作要做,然后在整个try/finally
结束后再做:
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);
如果您对做什么做了更复杂的决定,那么您当然可以使用List<Task>
到await
而不仅仅是布尔值。