在 Try Catch 中使用未赋值的局部变量



似乎这个特定的错误已经解决了很多次,但我的代码片段有一些不同,因为它永远不会导致"未分配"错误。

这段代码来自我为学校做的一个项目。我可以寻求帮助,这就是我希望在这里找到的。我不在乎掩盖任何变量或其他任何东西,因为它不是出于商业目的。

这是编译时的错误:"使用未赋值的局部变量'日期开始实际'"

switch (userType)
{
    case "Doctor":
        string qualification = Microsoft.VisualBasic.Interaction.InputBox("What is the highest qualification this person has", "Qualification", "", -1, -1);
        while (dateStarted == "")
        {
            try
            {
                dateStarted = Microsoft.VisualBasic.Interaction.InputBox("On which date did this person start", "Date Started", "", -1, -1);
                int day = Convert.ToInt32(Regex.Match(dateStarted, @"d{2}").Value);
                dateStarted.Remove(0,3);
                int month = Convert.ToInt32(Regex.Match(dateStarted, @"d{2}").Value);
                dateStarted.Remove(0,3);
                int year = Convert.ToInt32(Regex.Match(dateStarted, @"d{4}").Value);
                dateStartedActual = new DateTime(day, month, year);
            }
            catch (Exception ex)
            {
                MessageBox.Show("The date entered is not valid");
                dateStarted = "";
            }
        }
        string field = Microsoft.VisualBasic.Interaction.InputBox("In which field does this person practice", "Field", "", -1, -1);
        CreateDoctor(qualification, dateStartedActual, field);
        break;

有两种方法可以解决此错误。

第一

在 catch 块中分配一些 dateStartedActual 值。

第二

在尝试阻止之前提供一些默认值dateStartedActual。在这种情况下,如果 try 块中有任何异常,您的dateStartedActual将具有您提供的默认值。

我的代码片段有一些不同的东西,因为它永远不会导致"未分配"错误

好吧,它显然确实会导致该错误,这就是您问这个问题的原因,不是吗?

即使你知道任何时候抛出异常,你都会再次循环,编译器不知道......因此错误。该值未明确分配。当然,你可以一开始就给它一个虚拟值——但我个人不喜欢这样做。

您最好将解析代码提取到一个单独的方法中,该方法可能如下所示:

static DateTime RequestStartDate()
{
    while (true)
    {
        try
        {
            // Ask for date and parse it
            // ...
            return parsedDate;
        }
        catch (Exception e) // See below...
        {
            MessageBox.Show("The date entered is not valid");
        }
    }
}

该方法最终肯定会返回一个DateTime,或者永远循环 - 因此通过调用该方法分配的任何变量都将被明确分配。

然后在主代码中,您可以编写:

switch (userType)
{
    case "Doctor":
        string qualification = Microsoft.VisualBasic.Interaction.InputBox("What is the highest qualification this person has", "Qualification", "", -1, -1);
        DateTime dateStarted = RequestStartDate();
        string field = Microsoft.VisualBasic.Interaction.InputBox("In which field does this person practice", "Field", "", -1, -1);
        CreateDoctor(qualification, dateStarted, field);
        break;

顺便说一句,你打电话给string.Remove而忽略了结果 - 总是一个坏主意。手动解析日期是不必要的复杂 - 使用 DateTime.TryParseExact .

此外,捕获Exception通常是一个坏主意 - 您应该捕获特定的异常...尽管如果您使用 DateTime.TryParseExact则不需要捕获任何内容,因为如果无法解析值,它只会返回false

我还建议您至少Microsoft.VisualBasic制定一个using指令,以便您可以使用:

string qualification = Interaction.InputBox(...);

等等,而不是每次都排很长的队。

相关内容

  • 没有找到相关文章

最新更新