try-catch异常。由于某种原因,程序不会发现任何错误

问题描述 投票:0回答:3

我已经尝试了多种方法让我的程序通过使用try get来捕获错误,当用户没有在其中一个文本框的文本框中输入任何数据时,另一个用户没有输入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

c# wpf try-catch
3个回答
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);
}

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类型通常是不好的做法,因为你可能会捕获在捕获区内无法正常处理的异常。吞咽它们会显着增加脱困难度。

我还会注意到异常并不是执行更复杂的验证逻辑的完美方式,因为throw会直接跳转到下一个匹配的catch,因此并非所有字段都会被验证。


0
投票

谢谢你输入的人。我决定在阅读你的评论后离开Try-Catch,我发现它不适合我想做的事情。我用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; 
        }
© www.soinside.com 2019 - 2024. All rights reserved.