考虑以下代码片段:
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,正如您从数据提示中看到的那样:
咦?捕获的异常如何为空?当然,这是一个矛盾的说法,如果我在一个捕获区内,这个例外可能是空的吗?
什么?如何在范围内有三个具有相同名称的变量?
我失去了理智吗?我很肯定这是我多年来一直使用的模式没有问题......
更新
Yuriy Faktorovich在评论中建议.NET exception caught is unexpectedly null可能是相关的。我认为他正在做点什么,因为我在解决方案中使用Code Contracts而不是在这个特定的方法中。看起来,代码合约似乎有牵连。另一个问题的响应者之一建议重命名变量是有效的,事实上确实如此。如果我给他们打电话ex1
,ex2
和ex3
那么一切都很好。我认为当使用CCREWRITE并且调试器感到困惑时,IL中存在细微差别。