被忽略的异常(C#Form应用程序)

时间:2015-04-17 23:12:47

标签: c#

我正在编写一个程序,我需要用try ... catch块来编写捕获空或一般输入异常,并确保输入在两个带有if语句的数字之间。

我的问题是,当我输入null,字符串或其他字符时,异常会被忽略,它只是直接转到if语句。如果我注释掉if语句,则异常仍然没有被捕获。

const char DELIM = ',';
int input;
const int MIN = 1;
const int MAX = 10;
//convert the input to an integer
int.TryParse(tbInput.Text, out input);  
//check if the user has selected enter yet
if (e.KeyCode == Keys.Enter)
{
    try
    {                                      
        //if the number entered is out of ranger, show error
        if (input < MIN || input > MAX)
        {
            MessageBox.Show("Please enter an integer between 1 and 10");
        }
        else
        {
            //if the number is in range, write to file
            StreamWriter writer = new StreamWriter(file);
            writer.WriteLine(input.ToString() + DELIM + " ");
            writer.Flush();
            //flush the information to the file each time
        }
    }
    // any exceptions that occur will be caught here
    catch (IOException)
    {
        MessageBox.Show("Error with input");
    }
    finally
    {
        //clear the taxtbox for the next entry
        tbInput.Clear();                    
    }
}

这是我的代码。如果有人可以指出我错过了什么,或者我应该改变什么,我真的很感激。 干杯!

4 个答案:

答案 0 :(得分:3)

检查给定参数时,

int.TryParse返回一个布尔值。转换尝试失败时,input将分配默认值(0)。修改您的代码以检查int.TryParse的结果。

if (int.TryParse(tbInput.Text, out input)) 
{
  // ok
}
else 
{
  // not ok
}

答案 1 :(得分:1)

  

我的问题是,当我输入null,字符串或其他字符时,异常会被忽略,它只是直接转到if语句。如果我注释掉if语句,则异常仍然没有被捕获。

您正在尝试使用Integer.TryParse解析输入。该方法返回一个布尔值来表示成功(或缺少成功)。正如我所料,您无法使用该方法控制流量。

尝试

if (int.TryParse(tbInput.Text, out input)) 

答案 2 :(得分:1)

int.TryParse永远不会失败。如果它没有成功,它将返回false。您可以执行以下操作:

int input; 
if (e.KeyCode == Keys.Enter)
{
    if (int.TryParse(tbInput.Text, out input) && input >= MIN && input <= MAX)
    {
        ...
    }
    else
    {
        MessageBox.Show("Please enter an integer between 1 and 10");
    }
}

或者,您可以将int.Parse放入try catch并捕获FormatExceptionOverflowException(因为它可能会失败)。我将使用Convert.ToInt32,因为它与int.Parse几乎相同,但如果参数为null而不是抛出ArgumentNullException,则返回0。

if (e.KeyCode == Keys.Enter)
{
    try
    {
        int input = Convert.ToInt32(tbInput.Text);
        ...
    }
    catch (FormatException)
    {
        MessageBox.Show("Input was in an invalid format.");
    }
    catch (OverflowException)
    {
        MessageBox.Show("The input was outside the valid range for integers.");
    }
    catch (IOException)
    {
        MessageBox.Show("Error with input");
    }
}

答案 3 :(得分:0)

您的问题是您使用的是TryParse而不是ParseTryParse返回false,但如果解析失败则不会抛出异常。

尝试使用:

input = int.Parse(tbInput.Text);