在Catch Block中使用Await

时间:2013-12-11 21:14:17

标签: c# async-await

在我的应用程序中,用户尝试登录。有时网站将无法登录 - 即使凭据正确 - 并要求用户输入验证码。这意味着他们必须尝试两次登录。

我的应用程序有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");
        }
    }

我怎样才能解决这个问题?

1 个答案:

答案 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而不仅仅是布尔值。