尝试捕获异常。由于某些原因,程序无法捕获任何错误

时间:2019-03-27 17:27:53

标签: c# wpf try-catch

当用户未在其中一个文本框的文本框中输入任何数据,而在用户未正确输入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

3 个答案:

答案 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; 
        }