在文本框中输入输入并按下按钮时处理了错误的异常
本文关键字:输入 处理 错误 异常 按钮 文本 | 更新日期: 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
。(您最好使用比aN
和am
更长、更具描述性的变量名。)
对于您关于异常处理的问题,最直接的答案是为该方法所采取的单独操作使用单独的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
}