我正在调查我申请中的一些案件。我有这个代码来读取XML元素,目的是跳过那些触发异常的元素:
bool res = true;
// Start parsing the XML file
using (XmlReader reader = XmlReader.Create(xmlFilePath))
{
while (res)
{
try
{
// Read
res = reader.Read();
if (res == false)
break;
// Is this XML element?
if ((reader.NodeType == XmlNodeType.Element))
{
// What is its name?
if (reader.Name == "Test")
{
//...
}
}
}
catch (Exception ex)
{
// Exception - continue to reading other XML elements
HelperMethods.AppendToLogFile("Method: TryRetrieveRestartReasons. " + terminalName + " " + "Filename: " + xmlFilePath + "Ex: " + ex.Message, LogType.Error);
// HelperMethods.TryInsertParsingExceptionToDatabase(terminalName, Path.GetFileNameWithoutExtension(xmlFilePath) + ".log", ex.Message);
}
}
}
我的问题是你认为上面的片段会导致无限循环吗? 否则,如何跳过在XML文件中生成异常的那些行
,你将如何继续编写代码答案 0 :(得分:1)
考虑reader.Read()
成功读取一次的情况,然后每次都抛出异常。
第一次调用res = reader.Read()
行时,res
设置为true
。然后,每次reader.Read()
之后都会抛出异常。关键部分是当它抛出异常时res
没有任何反应。它保留其值true
。
因此,您捕获异常,res
保持true
,循环重新开始。 while
说"是的,res
是true
。继续前进。"然后,在将res
设置为其他任何内容之前抛出另一个异常。
所以,只要reader.Read()
抛出异常并且你至少有一次成功的Read()
调用,那么你将获得无限循环。
答案 1 :(得分:0)
我需要知道是否有人确认读者是否会回答 总是在上面的代码中返回false
它不会总是返回false
由于XmlReader.Read
可以抛出异常(例如,当XML无效时),因此try-catch
和reader.Read
存在问题。
如果Read
抛出异常,则t
永远不会变为false
,您将获得无限循环。循环的第一行应该是while (reader.Read())
。
下次我调用Reader.Read - 它返回FALSE
你不能确定。 即使现在/某些XML示例都是如此,这也是实现细节。此行为未记录。我不会依赖它。