【问题标题】:Cannot catch FileNotFoundException无法捕获 FileNotFoundException
【发布时间】:2015-02-16 14:57:09
【问题描述】:

我想我遇到了与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(...);但是,我仍然想知道为什么这不起作用。

【问题讨论】:

  • Jon 不是在谈论“禁用异常”。有两种方法可以让调试器处理异常:1.) 在抛出异常时立即中断,或 2.) 在 catch 块未处理异常时中断。如果您启用了 1.),则调试器将中断,尽管 catch 块稍后会处理异常。
  • 好的。所以,我刚刚启用了Tools -&gt; Options -&gt; Debugger -&gt; General -&gt; Enable Just My Code。但是,我仍然有同样的问题。
  • 再次,当在新项目中使用这段代码时,异常被正确捕获。我在调试模式下运行这两个项目。这对我来说仍然没有任何意义。
  • 错误选项:调试器 -> 异常... -> 全部重置

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


【解决方案1】:

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

【讨论】:

  • 感谢您的解释!当我运行this project 时,调试器不会拦截,尽管我在调试模式下运行它。你能告诉我为什么吗?
  • 我刚刚注意到this projectDebug -&gt; Exceptions 中有不同的设置。我当前的项目没有名为User-unhandled 的列。我想,那是我的问题。
  • 问题已解决。你是对的,当然。我还有另一个问题:我在 xPath 中使用了数字,这似乎是不允许的。这引发了一个未处理的异常。
【解决方案2】:

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

这就是为什么他们说如果您想查看代码在实际使用中的执行情况,请停用它。停用它,运行代码,查看捕获的异常并重新激活它。

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

【讨论】:

  • 或者直接按 F5 让控制流到异常处理程序。
  • 好的,但是当我创建一个新项目并将这段代码复制到该新项目中时,调试器不会拦截任何内容。这是为什么呢?
  • @berti 这将取决于两件事:您是否在调试器控制下运行代码,以及(如果在调试器下运行)是否将调试设置设置为拦截异常。跨度>
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
相关资源
最近更新 更多