字符串没有被抛出

时间:2016-07-05 01:32:10

标签: c# exception-handling throw

我是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");
    }
}

3 个答案:

答案 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。