在文本框中输入输入并按下按钮时处理了错误的异常

本文关键字:输入 处理 错误 异常 按钮 文本 | 更新日期: 2023-09-27 18:26:39

当我正确输入了账号和要提取的金额时,我会一直收到"输入整数"消息框。

假设我输入了"12"作为账号,输入了"50"(或"50.0")作为金额-我会收到"输入整数"异常消息框。

如果我什么都不输入,我会得到"输入账号",这是正确的。

如果我只输入账号(账号是否存在并不重要),但金额为空——按下提款按钮我什么也得不到。

如果我输入账号和金额(错误或正确,都无关紧要),我会收到"输入整数"异常消息框。

我哪里错了?

private void btnWithdraw_Click(object sender, EventArgs e)
        {
            if (!txtSearch.Text.Equals(""))
            {
                if(!txtAmount.Text.Equals(""))
                {
                    try
                    {
                        int aN = int.Parse(txtSearch.Text);
                        double am = double.Parse(txtAmount.Text);
                        client.Withdraw(aN, am);
                        MessageBox.Show(String.Format("Withdrawn {0} from {1}'nBalance now: {2}", am, aN));
                        //if(client.Fi)
                        //    MessageBox.Show(String.Format("Customer {0} couldn't be found", aN));
                        //else
                        //    MessageBox.Show(String.Format("Customer {0}'nBalance: {1}C", aN, client.CustomerBalance(aN).ToString()));
                    }
                    catch (FormatException)
                    {
                        MessageBox.Show("Enter an integer");
                    }
                    catch (NullReferenceException)
                    {
                        MessageBox.Show("Customer cannot be found");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
            else
            {
                MessageBox.Show("Enter account number");
            }
        }

在文本框中输入输入并按下按钮时处理了错误的异常

格式字符串指定了三个参数,但您只提供了两个:

String.Format("Withdrawn {0} from {1}'nBalance now: {2}", am, aN)

这会抛出一个FormatException,但不是您在编写FormatException catch块时所想的那个。

因此,为了避免这种异常,您需要一种方法来获得变量中的新余额,该变量可以传递给String.Format。(您最好使用比aNam更长、更具描述性的变量名。)

对于您关于异常处理的问题,最直接的答案是为该方法所采取的单独操作使用单独的try块,即解析两个不同的字符串、执行事务、格式化给用户的消息并显示该消息。这将允许将对int.Parse抛出的FormatException的处理与对string.Format抛出的FormatException的处理分开。

然而,正如Arion所建议的,对于解析用户输入,通常最好使用TryParse,而不是捕获异常(捕获FormatException的问题就是一个很好的例子!)。当然,这是假设您使用的框架版本具有TryParse方法;它们是在2.0版本中添加的。

为什么不能这样做:

int aN;
double am;
if(int.TryParse(txtSearch.Text,out aN) && double.TryParse(txtAmount.Text,out am))
{
    client.Withdraw(aN, am);
    MessageBox.Show(String.Format("Withdrawn {0} from {1}'nBalance now: {2}", am, aN));
}
else
{
    //Do something
}