【问题标题】:Variable Assigned in try...catch - Scope在 try...catch 中分配的变量 - 范围
【发布时间】:2014-02-04 19:23:41
【问题描述】:

我在 try...catch 之前声明了一个变量,并在 try 块中分配了它。我不断收到“fileDate”的未分配变量错误。

class Something
{
    string fACR = "BAK";
    int numbDays = 5;

    Public static void Main()
    {
        DateTime fileDate;
        try
        {
            fACR = args[0];
            numbDays = int.Parse(args[2]);
            fileDate = DateTime.Parse(args[1]);
        }
        catch (ArgumentException e)
        {
            Console.WriteLine("INVALID COMMAND LINE ARGUMENTS! Follow Format:");
            Console.WriteLine("<farm_acronym> <yyyy-M-d> <# days>");
            Console.WriteLine(e);
        }

        inFileName = "U:/CANSO/Engineering/Farms/" + fACR +
            "/DailyDownloads/";
        switch (fACR)
        {
            case "DEM":
                inFileName = inFileName + "Report_Recombiner_" + fileDate.ToString("yyyy-MM-dd") + 
                    ".csv";
                break;
            default:
                inFileName = inFileName + "REPORT_Recombiner_" + fileDate.ToString("yyyy-M-d") + 
                    ".csv";
                break;
        }
    }
}

我在声明时尝试使用它:

DateTime fileDate = null;

这也不起作用(DateTime 不可为空)。有什么建议吗?

【问题讨论】:

  • 如果异常被捕获,你仍然继续。如果解析失败,你想使用fileDate 的什么值?还是您的意思是将return 插入到 catch 块中?
  • 这是我的主要方法。不需要退货。如果不解析,只想抛出异常。
  • 您的代码不会抛出异常,它会捕获它。如果您单步执行,您会看到它继续在 catch 块之后运行。您应该在 catch 块的末尾使用 returnthrow

标签: c# scope unassigned-variable


【解决方案1】:

更新:如果在将错误记录到控制台后需要停止执行,则可以重新抛出异常。但是代码仍然需要更多改进。

其他人解释了错误背后的原因。但我建议你重构你的代码,把 try/catch 拿出来写成一个方法。但是下面的代码仍然不好。我不喜欢 fACRnumbDays 的定义方式。

class Something
{
    string fACR = "BAK";
    int numbDays = 5;

    Public static void Main()
    {
        DateTime fileDate = GetFileDate(args);


        inFileName = "U:/CANSO/Engineering/Farms/" + fACR +
            "/DailyDownloads/";
        switch (fACR)
        {
            case "DEM":
                inFileName = inFileName + "Report_Recombiner_" + fileDate.ToString("yyyy-MM-dd") + 
                    ".csv";
                break;
            default:
                inFileName = inFileName + "REPORT_Recombiner_" + fileDate.ToString("yyyy-M-d") + 
                    ".csv";
                break;
        }
    }
    public static DateTime GetFileDate(string[] args)
    {
        try
        {
            fACR = args[0];
            numbDays = int.Parse(args[2]);
            return DateTime.Parse(args[1]);
        }
        catch (Exception e)
        {
            Console.WriteLine("INVALID COMMAND LINE ARGUMENTS! Follow Format:");
            Console.WriteLine("<farm_acronym> <yyyy-M-d> <# days>");
            Console.WriteLine(e);
            throw;
        }
    }


}

【讨论】:

  • 在方法中使用 try/catch 获取“所有路径不返回值”。除非我在捕获结束时返回一个虚拟的 DateTime 值。但这是一种好的做法吗?
  • 不要 throw e; - 只是 throw; - 这样你就不会重置堆栈跟踪。
【解决方案2】:

你必须给它分配一些价值。如您所述,DateTime 不是引用类型,因此它不能为空。因此,只需为其分配一些您知道无效的默认值 - 例如,DateTime.MinValue。您可以稍后检查该值是否已分配。

当然,如果DateTime.MinValue 对您来说是一个有效 值,就像所有其他值一样,您应该使用更可靠的方法来检查是否进行了分配 - 例如,使用一个可以为空的DateTime?。一般来说,.NET 不赞成使用特殊值来标记无效数据——这正是 Nullable 类型的用途。

【讨论】:

    【解决方案3】:

    您可以使用可为空的 DateTime,“DateTime?” (这意味着,明确地,“也允许空值的 DateTime”),或者在这种情况下可能更简单,只需在创建 DateTime 时为其分配一个标志值,例如 DateTime fileDate = DateTime.MinValue

    当然,在这种情况下,您似乎只想在 catch 中返回并将 fileDate 放在 try 范围内 - 如果不是,将 fileDate 变量放在 try/catch 之外的范围内有什么好处无论如何初始化正确?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2018-08-05
      相关资源
      最近更新 更多