XmlDocument.Save 从 GC 线程抛出的未处理异常

Posted

技术标签:

【中文标题】XmlDocument.Save 从 GC 线程抛出的未处理异常【英文标题】:XmlDocument.Save unhandled exception thrown from GC thread 【发布时间】:2011-12-02 10:07:10 【问题描述】:

我开发了一个简单的应用程序,当我尝试将 XMLDocument 保存到没有足够可用空间的拇指驱动器时,会发生奇怪的事情。虽然我已经为 XMLDocument.Save(filePath) 添加了“try catch”子句,但我仍然得到一个未处理的异常,并且该异常似乎是从 GC 终结线程抛出的(似乎 GC 尝试刷新磁盘没有的另外 4096 个字节)。我认为使用 XMLDocument 对象是一个常见的场景,我想知道有什么问题吗?

代码sn-p:

XmlDocument query = new XmlDocument();
query.Load("g:\\test.xml");
... //modify the content of query to make it bigger
try

  query.Save("g:\\test.xml");

catch(Exception ex)

异常堆栈跟踪如下:

mscorlib.dll!System.IO.__Error.WinIOError(int errorCode = 112, string maybeFullPath = "") + 0x498 bytes mscorlib.dll!System.IO.FileStream.WriteCore(byte[] buffer, int offset, int count) + 0x119 bytes mscorlib.dll!System.IO.FileStream.FlushWrite(bool calledFromFinalizer) + 0x22 字节 mscorlib.dll!System.IO.FileStream.Dispose(bool disposing = false) + 0x57 bytes mscorlib.dll!System.IO.FileStream.Finalize() + 0x1b 字节

【问题讨论】:

什么是异常错误信息? Memory exception while XDocument.Save() 的可能重复项 【参考方案1】:

好吧,问题是某些代码 somewhere 在处理完 FileStream 后没有处理它。当FileStream 最终确定时,它会尝试刷新数据 - 此时会引发异常。

如果这确实是您的所有代码,听起来就像是 XmlDocument.Save() 中的一个错误,它肯定应该在返回之前关闭它的所有流。您可以通过自己打开FileStream(使用using 语句)并将流传递给XmlDocument.Save 来解决此问题。

【讨论】:

非常感谢您的回复!有用!但这是否意味着 XMLDocument 类确实存在错误?因为我认为只需遵循一个常见的场景来使用它。 @user1077127:听起来确实如此,是的。我不能肯定地说,但对我来说它没有明确关闭流似乎很奇怪。您可能想在 Connect 上提交错误。

以上是关于XmlDocument.Save 从 GC 线程抛出的未处理异常的主要内容,如果未能解决你的问题,请参考以下文章

XML 配置文件 XmlDoument.Save 未更新 ConnectionString

XmlDocument 类正在删除格式、c#、.NET

将异常从一个线程重新抛出到另一个线程

为啥我看不到从 java 守护线程抛出的异常 [重复]

忽略从另一个线程抛出的 InterruptedException [重复]

从线程抛出异常并没有给出预期的结果