当用户未在其中一个文本框的文本框中输入任何数据,而在用户未正确输入9的文本框中输入其他数据时,我尝试了多种方法使程序捕获错误。数字插入文本块。我正在使用C#WPF。
我尝试了许多不同的方法。似乎有效的一个方法是当我转换为整数时,由于某种原因似乎捕获了它,但是我改用字符串。例如
try
{
// remmeber, textboxes always capture the data as a string therefore we need to convert to an integer
CourseDetails.Name = Convert.ToInt32(txtName.Text);
CourseDetails.SCNnumber = Convert.ToInt32(txtSCNnumber.Text);
}
// if something does go wrong with any of the instructions in the try block then we will catch the error rather than crash the program
catch (Exception)
{
MessageBox.Show("Please complete all fields");
return;
}
try
{
if (txtName.Text.Length < 0)
{
MessageBox.Show("Enter your full name");
}
else
{
CourseDetails.Name = txtName.Text;
}
if (txtSCNnumber.Text.Length != 9)
{
MessageBox.Show("SCN number must be 9 characters long");
}
else
{
CourseDetails.SCNnumber = txtSCNnumber.Text;
}
}
catch (Exception)
{
MessageBox.Show("Please complete all fields");
}
我要寻找的结果是,当用户在第一个文本框中输入名称时,应将其保存到CourseDetails.Name变量中;否则,如果将其保留为空白,程序将捕获此错误并显示信息。
对于第二个文本框,如果用户输入的字符不是9个字符,则程序将显示一条错误消息,指出电话号码必须超过9个字符。否则,程序会将用户输入保存到变量CourseDetails.SCNnumber
答案 0 :(得分:1)
try-catch块捕获异常。要捕获异常,必须抛出异常。您的第一个try-catch块将起作用,因为如果输入无效,则Convert.ToInt32
会抛出FormatException
,如记录的here所示。
要使第二个try-catch块起作用,必须在无效输入上引发异常。
try
{
if (txtName.Text.Length < 0)
{
throw new ValidationException("Please enter user name")
}
// ...
}
catch(ValidationException ex)
{
MessageBox.Show(ex.Message);
}
如您所见,我遇到了特定的异常类型。捕获Exception
类型通常是不好的做法,因为您可能捕获无法在该catch块内正确处理的异常。吞下它们会显着增加去磁困难。
我还要指出,异常不是执行更复杂的验证逻辑的完美方法,因为throw
会跳到下一个匹配的catch,因此并非所有字段都会得到验证。
答案 1 :(得分:0)
您必须了解Try-Catch块的用途。它们的主要作用是处理程序中的异常。如果程序中有错误,则这些异常可以是CLR或程序代码引发的编译器异常。这些异常需要处理以防止程序崩溃。 C#提供内置支持,以使用try,catch和finally块来处理异常。
现在在您的代码中,不要在您的MessageBox.Show
块中显示您的Exception
。这基本上意味着,仅当引发异常时,您的MessageBox才会显示。如果您的txtName.Text
的Integer转换不正确,则会发生此异常(参考您的代码)。
请在您的方案中使用If-Else条件。例如:
//Try to parse your captured data to Integer
try
{
if(txtName.Text == "" && txtSCNnumber.Text == "")
{
MessageBox.Show("Please complete all fields");
}
else
{
// remmeber, textboxes always capture the data as a string therefore we need to convert to an integer
CourseDetails.Name = Convert.ToInt32(txtName.Text);
CourseDetails.SCNnumber = Convert.ToInt32(txtSCNnumber.Text);
}
}
//If the parse fails, then throw an exception
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
答案 2 :(得分:0)
感谢您的投入。在阅读您的评论后,我决定不去尝试试用,因为我意识到它不适合我要尝试做的事情。我使用If-Else语句简化了它,如下所示。
if (txtName.Text == "" && txtSCNnumber.Text == "")
{
MessageBox.Show("Please complete all fields");
txtName.Focus();
}
else if (txtSCNnumber.Text.Length != 9)
{
MessageBox.Show("You have entered an invalid SCN number");
txtSCNnumber.Focus();
}
else
{
CourseDetails.Name = txtName.Text;
CourseDetails.SCNnumber = txtSCNnumber.Text;
}