我正在编写一个程序,我需要用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();
}
}
这是我的代码。如果有人可以指出我错过了什么,或者我应该改变什么,我真的很感激。 干杯!
答案 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并捕获FormatException
和OverflowException
(因为它可能会失败)。我将使用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
而不是Parse
。 TryParse
返回false,但如果解析失败则不会抛出异常。
尝试使用:
input = int.Parse(tbInput.Text);