这段代码可以导致无限循环

时间:2015-05-13 06:43:37

标签: c#

我正在调查我申请中的一些案件。我有这个代码来读取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文件中生成异常的那些行

,你将如何继续编写代码

2 个答案:

答案 0 :(得分:1)

考虑reader.Read()成功读取一次的情况,然后每次都抛出异常。

第一次调用res = reader.Read()行时,res设置为true。然后,每次reader.Read()之后都会抛出异常。关键部分是当它抛出异常时res没有任何反应。它保留其值true

因此,您捕获异常,res保持true,循环重新开始。 while说"是的,restrue。继续前进。"然后,在将res设置为其他任何内容之前抛出另一个异常。

所以,只要reader.Read()抛出异常并且你至少有一次成功的Read()调用,那么你将获得无限循环。

答案 1 :(得分:0)

  

我需要知道是否有人确认读者是否会回答   总是在上面的代码中返回false

它不会总是返回false 由于XmlReader.Read可以抛出异常(例如,当XML无效时),因此try-catchreader.Read存在问题。

如果Read抛出异常,则t永远不会变为false,您将获得无限循环。循环的第一行应该是while (reader.Read())

  

下次我调用Reader.Read - 它返回FALSE

你不能确定。 即使现在/某些XML示例都是如此,这也是实现细节。此行为未记录。我不会依赖它。