无法捕获FileNotFoundException

时间:2015-02-16 14:57:10

标签: c# wpf exception-handling .net-4.5

我认为我遇到的问题与this Thread中已经提到的类似。当我在当前项目中运行以下代码时,我收到System.IO.FileNotFoundException,虽然我确实抓住了它。

XmlDocument xmlDocument = new XmlDocument();

public LoadFile(string xmlFile)
{
    try {xmlDocument.Load(xmlFile);}
    catch {xmlDocument.LoadXml("<settings></settings>");} // File does not exist
}

但是,当我使用这段代码创建一个新项目时,可以正确捕获异常。

我看不出我当前的项目和新项目(相同的.NET版本,都是32位)之间有任何区别。

在另一个帖子中, Jon Skeet 给出了以下问题的答案:

  

我的猜测是,它在最初抛出时会调试调试器中的FileNotFoundException,但它会被catch块正确捕获。您可以更改异常的调试器设置 - 或者只是在调试器外部运行它。

我不明白。我不想禁用FileNotFoundException。有人可以进一步解释这个吗?

编辑:我知道我可以使用File.Exists(...)代替;但是,我仍然想知道为什么这不起作用。

2 个答案:

答案 0 :(得分:0)

他说调试器正在捕获(拦截)错误并在屏幕上显示某些内容,而不是允许实际的catch机制抛出错误。

这就是为什么如果你想看看代码在实际使用中的表现如何,他们会说停用它。取消激活它,运行代码,查看被捕获的异常并重新激活它。

您可能希望在加载其他项目时检查设置。它可能有一个存储配置,说停用调试器拦截FileNotFoundException。

答案 1 :(得分:0)

如果在调试器控制下运行代码,调试器将始终拦截catch块之前的异常。问题是调试器是否显示消息,这取决于调试器设置。如果调试器通过显示消息来处理异常,那么由您决定是否继续执行(这会将控制传递给您的catch块)或不是(终止您的应用程序)。这取决于您对对话框的响应方式。如果在调试器中关闭“抛出”异常,您仍会看到调试器正在拦截它们的证据(它们将在“输出”窗口中记录),但是对于catch块的控制流不会中断。 / p>