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