从我不应该得到的方法中获取错误代码

时间:2014-03-13 02:59:00

标签: c# debugging

我似乎在我的代码的这两个部分中误导或误用了代码。我理解是什么导致程序在调试时给我IsOperator错误消息。奇怪的是,+运算符可以工作,但其他运算符都没有。

public bool IsValidData()
{  
    return
        IsPresent(txtOperand1, "Operand 1") &&
        IsDecimal(txtOperand1, "Operand 1") &&
        IsWithinRange(txtOperand1, "Operand 1", 0, 1000000) &&

        IsPresent(txtOperator, "Operator") &&
        IsOperator(txtOperator, "+, -, *, /") &&

        IsPresent(txtOperand2, "Operand 2") &&
        IsDecimal(txtOperand2, "Operand 2") &&
        IsWithinRange(txtOperand2, "Operand 2", 0, 1000000);
}

public bool IsOperator(TextBox textBox, string operators)
{
    try
    {
        foreach (string s in operators.Split(new char[] { ',' }))
        {
            if (textBox.Text.Trim() == s)
                return true;
            else
                throw new ArgumentException("The operator must be a valid operator: +,-, *, /", "name");
        }
        return true;

    }
    catch (ArgumentException ex)
    {
        MessageBox.Show(ex.Message);
        txtOperator.Focus();
        return false;
    }
}

2 个答案:

答案 0 :(得分:5)

您的运算符列表包含空格:

"+, -, *, /"

这会导致意外行为。尝试:

"+,-,*,/"

或者,防御性地修剪s变量......

您正在修剪文本输入,但不是与其进行比较的运算符,因此如果if (textBox.Text.Trim() == s)包含空格,则s将永远不会为真。

此外,您正在根据运算符列表检查文本 - 如果它与第一个运算符不匹配也会失败,因为只要该比较失败,就会抛出Argument Exception

例如,您的文本框包含*,您的第一个运算符为+

if ("*" == "+") // FAIL

我的建议编辑 - 只有在您全部检查后才会失败:

    foreach (string s in operators.Split(new char[] { ',' }))
    {
        if (textBox.Text.Trim() == s.Trim()) {
            return true;
        }
    }

    MessageBox.Show("The operator must be a valid operator: " + operators);
    txtOperator.Focus();
    return false;

答案 1 :(得分:0)

您可以使用Array.IndexOf执行此操作。

public bool IsOperator(TextBox textBox, string operators)
{
    string[] operatorArray = operators.Split(new char[] { ',' });
    if (Array.IndexOf(operatorArray, textBox.Text.Trim()) >= 0) {
        return true;
    } else {
        MessageBox.Show("The operator must be a valid operator: +,-, *, /");
        textBox.Focus();
        return false;
    }
}

注意:运营商必须像" +, - ,*,/"嵌入在运算符字符串中的空格可能会破坏此功能。