有几个使用相同变量名的catch块是否可以?

时间:2016-01-10 17:24:37

标签: c# exception exception-handling

考虑以下代码片段:

    public void Run()
        {
        var caseInsensitiveParser = new Parser(with =>
            {
            with.CaseSensitive = false;
            with.IgnoreUnknownArguments = true;
            with.HelpWriter = Console.Error;
            });
        try
            {
            options = caseInsensitiveParser.ParseArguments<HorizonAppOptions>(commandLineArguments);
            if (options.Errors.Any()) { errorMessages.Add("Unable to process command line arguments."); }
            }
        catch (Exception ex)
            {
            errorMessages.Add(ex.Message);
            }

        IHorizonExporter exporter = null;
        IHorizonImporter importer = null;

        try
            {
            if (!string.IsNullOrWhiteSpace(options.Value.Importer))
                {
                importer = GetImporter();
                importer.ProcessCommandLineArguments(caseInsensitiveParser, commandLineArguments);
                }
            }
        catch (Exception ex)
            {
            errorMessages.Add(ex.Message);
            }

        try
            {
            if (!string.IsNullOrWhiteSpace(options.Value.Exporter))
                {
                exporter = GetExporter();
                exporter.ProcessCommandLineArguments(caseInsensitiveParser, commandLineArguments);
                }
            }
        catch (Exception ex)
            {
            errorMessages.Add(ex.Message);
            }

        if (importer==null || exporter==null)
            errorMessages.Add("Both an importer and an exporter must be specified.");

        if (errorMessages.Any())
            {
            foreach (var errorMessage in errorMessages) { Console.WriteLine(errorMessage); }
            DisplayImportersAndExporters();
            Environment.Exit(-1);
            }
        else
            {
            // Perform the import and the export.
            var horizon = importer.ImportHorizon();
            exporter.ExportHorizon(horizon);
            }
        }

我正在点击第二个catch()条款并得到一些非常奇怪的结果。该异常源于尝试打开不存在的文件。我希望得到DirectoryNotFoundException,但在catch块中我看到ex实际上是null,正如您从数据提示中看到的那样: Null exception?  咦?捕获的异常如何为空?当然,这是一个矛盾的说法,如果我在一个捕获区内,这个例外可能是空的吗?

现在等一下......在调试器的本地窗口中,有以下内容: enter image description here

什么?如何在范围内有三个具有相同名称的变量?

我失去了理智吗?我很肯定这是我多年来一直使用的模式没有问题......

更新

Yuriy Faktorovich在评论中建议.NET exception caught is unexpectedly null可能是相关的。我认为他正在做点什么,因为我在解决方案中使用Code Contracts而不是在这个特定的方法中。看起来,代码合约似乎有牵连。另一个问题的响应者之一建议重命名变量是有效的,事实上确实如此。如果我给他们打电话ex1ex2ex3那么一切都很好。我认为当使用CCREWRITE并且调试器感到困惑时,IL中存在细微差别。

0 个答案:

没有答案