我是C#的新手。虽然抛出其他条件的例外工作正常,但字符串(或缺少条目将是一个更好的术语)不起作用。它改为直接捕获(FormatException)消息。
我知道我可以在前面提到的catch语句中使用相同的语句 if(txtSubtotal.Text ==“”),它会正常工作,但我真的很好奇为什么我不能通过抛出新的异常来做到这一点。
private void btnCalculate_Click(object sender, EventArgs e)
{
try
{
decimal subtotal = Decimal.Parse(txtSubtotal.Text);
{
if (txtSubtotal.Text == "")
throw new Exception("Subtotal is a Required Field.");
if (subtotal <= 0)
throw new Exception("Subtotal must be greater than 0");
if (subtotal >= 10000)
throw new Exception("Subtotal must be less than 10000");
}
decimal discountPercent = .25m;
decimal discountAmount = subtotal * discountPercent;
decimal invoiceTotal = subtotal - discountAmount;
discountAmount = Math.Round(discountAmount, 2);
invoiceTotal = Math.Round(invoiceTotal, 2);
txtDiscountPercent.Text = discountPercent.ToString("p1");
txtDiscountAmount.Text = discountAmount.ToString();
txtTotal.Text = invoiceTotal.ToString();
txtSubtotal.Focus();
}
catch (FormatException)
{
MessageBox.Show("Please enter a valid number for the Subtotal field.", "Entry Error");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\n" + "\n", "Entry Error");
}
}
答案 0 :(得分:2)
如果方法的参数(Decimal.Parse()
)不可转换,方法txtSubtotal.Text
将抛出FormatExceptions。为避免这种情况,您可以信任Decimal.TryParse()
执行相同的操作,而不需要try..catch
尝试以下代码:
decimal subtotal;
if (Decimal.TryParse(txtSubtotal.Text, out subtotal))
{
if (subtotal <= 0)
MessageBox.Show("Subtotal must be greater than 0");
else if (subtotal >= 10000)
MessageBox.Show("Subtotal must be less than 10000");
else
{
// Process your code here
}
}
else
{
MessageBox.Show("Invalid Input! Subtotal Expecting a Decimal value");
}
答案 1 :(得分:0)
在这里结合一些事情,首先我认为存在一个混淆了预期结果的逻辑问题。拿这个摘录......
decimal subtotal = Decimal.Parse(txtSubtotal.Text);
{
if (txtSubtotal.Text == "")
throw new Exception("Subtotal is a Required Field.");
...
Decimal.Parse总是会在空字符串或任何其他无法转换为小数的值上抛出FormatException。这意味着下一个if条件永远不会被执行。如果它确实被执行了,那么它永远不会是真的,因为你只是用成功的Decimal.Parse证明了它。
答案 2 :(得分:0)
此行为是由于您的字符串为null或为空而且代码尝试将空字符串或空字符串解析为Decimal。
在尝试解析字符串之前检查字符串会更好。您还可以使用字符串类中的string.IsNullOrWhitespace方法轻松检查字符串的内容。
像这样:
try
{
if (string.IsNullOrWhitespace(txtSubtotal.Text))
throw new Exception("Subtotal is a Required Field.");
decimal subtotal = Decimal.Parse(txtSubtotal.Text);
//rest of your code.
使用这样的代码并且字符串是null或空格,将抛出基本的Exception ...但是如果字符串是NOT null或空格并且它也不是有效的数字格式,那么代码将抛出FormatException。