在Try Catch中使用未分配的局部变量

时间:2013-11-02 08:27:31

标签: c# datetime try-catch unassigned-variable

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

此代码来自我正在为学校所做的项目。我被允许寻求帮助,这是我希望在这里找到的。我并不关心掩盖任何变量或任何变量,因为它不是出于商业目的。

这是编译时的错误: “使用未分配的局部变量'dateStartedActual'”

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;

2 个答案:

答案 0 :(得分:2)

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

<强>第一

在catch块中指定dateStartedActual的一些值。

OR

<强>第二

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

答案 1 :(得分:1)

  

我的代码段有一些不同之处,因为它永远不会导致“未分配”错误

很明显,确实导致了这个错误,这就是你问这个问题的原因,不是吗?

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

最好将解析代码解压缩到一个单独的方法中,它看起来像:

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

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

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

等,而不是每次都有一个很长的线。