1

运行此特定代码块时,我在 XML 中遇到异常。我已经建立了一个 try-catch,但 VS2010 说“'WindowsFormsApplication1.Form1.GetDocumentsData(string)':并非所有代码路径都返回一个值”。异常范围从空值到 XML 格式异常。我只需要捕获它们并将它们记录到一个文件中(那部分代码还没有完成)。

C#代码:

    private static IEnumerable<object[]> GetDocumentsData(string folderPath = @"filepath")
    {
        try
        {
            return Directory.GetFiles(folderPath, "*.xml")
               .Select(XDocument.Load)
               .SelectMany(file => file.Descendants().Where(e => e.Name.LocalName == "FilingLeadDocument").Concat(file.Descendants().Where(e => e.Name.LocalName == "FilingConnectedDocument")))
               .Select(documentNode =>
               {
                   var receivedDateNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentReceivedDate");
                   var descriptionNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentDescriptionText");
                   var metadataNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentMetadata");
                   var registerActionNode = metadataNode.Elements().FirstOrDefault(e => e.Name.LocalName == "RegisterActionDescriptionText");

                   return new object[]
  {
       (string)documentNode.Parent.Parent.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentIdentification"),
       (DateTime?)receivedDateNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DateTime"),
       descriptionNode != null ? descriptionNode.Value.Trim() : string.Empty,
       registerActionNode != null ? registerActionNode.Value.Trim() : string.Empty
  };
               }).ToArray();
        }
        catch (Exception e)
        { }
    }
4

5 回答 5

5

IEnumerable要修复您的实际编译错误,只需在发生异常时返回一个空:

private static IEnumerable<object[]> GetDocumentsData(string folderPath = @"filepath")
{
    try
    {
        return Directory.GetFiles(folderPath, "*.xml")
           .Select(XDocument.Load)
           .SelectMany(file => file.Descendants().Where(e => e.Name.LocalName == "FilingLeadDocument").Concat(file.Descendants().Where(e => e.Name.LocalName == "FilingConnectedDocument")))
           .Select(documentNode =>
           {
               var receivedDateNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentReceivedDate");
               var descriptionNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentDescriptionText");
               var metadataNode = documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentMetadata");
               var registerActionNode = metadataNode.Elements().FirstOrDefault(e => e.Name.LocalName == "RegisterActionDescriptionText");

              return new object[]
              {
                   (string)documentNode.Parent.Parent.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentIdentification"),
                   (DateTime?)receivedDateNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DateTime"),
                   descriptionNode != null ? descriptionNode.Value.Trim() : string.Empty,
                   registerActionNode != null ? registerActionNode.Value.Trim() : string.Empty
              };
           }).ToArray();
    }
    catch (Exception e)
    { 
        return Enumerable.Empty<object[]>();
    }
}

但是,我会质疑您为什么对这些错误“满意”-> 通常不应忽略异常。如果这里发生异常,您期望在链条的更上游发生什么?

于 2013-10-29T15:16:04.463 回答
1

您收到错误是因为块中没有return语句catch。这是必要的,因为如果抛出异常,该方法必须返回什么?
所以,添加块,当你在项目的其他地方使用你的方法时,return null;检查.catchnull

于 2013-10-29T15:16:10.393 回答
1

您的代码不会在 catch 块中返回值。这就是您的代码无法编译的原因。您应该决定在抛出异常时要从此方法返回什么值。或者,可能是,您应该在调用方方法中捕获此异常,而不是在这里。

于 2013-10-29T15:16:50.763 回答
0

由于您的方法应该返回一个值,这意味着 Catch 块是一个应该返回一些东西的块。
要么IEnumerable<object[]>null要么你应该扔一个Exception让别人处理它。由于您的 catch 块防止异常飞回,因此您应该将此块视为在 try catch 块之外

编辑 - 这是一个不同的故事
,你必须将它分成 foreach,而不是在 foreach 中执行 try catch
,如果 catch 命中,它将写入日志并继续下一个。
(您的代码无法阅读,我认为您可能想将其分解为块)

 private static IEnumerable<object[]> GetDocumentsData(string folderPath = @"filepath")
        {
            IList<object[]> collection = new List<object[]>();
            foreach (var file in Directory.GetFiles(folderPath, "*.xml"))
            {
                try
                {
                    /// do the proccecing here
                    collection.Add(/*your found elements*/);
                }

                catch(Exception e)
                {
                    log.Error("Cant get collection", e);

                }
            }
            return col;
        }

另一种解决方案 - 请注意我不知道您的代码以及抛出异常的位置

private static IEnumerable<object[]> GetDocumentsData(string folderPath = @"filepath")
        {

                return Directory.GetFiles(folderPath, "*.xml")
                   .Select(XDocument.Load)
                   .SelectMany(file => file.Descendants().Where(e => e.Name.LocalName == "FilingLeadDocument").Concat(file.Descendants().Where(e => e.Name.LocalName == "FilingConnectedDocument")))
                   .Select(documentNode =>
                   {
                       try
                       {
                           var receivedDateNode =
                               documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentReceivedDate");
                           var descriptionNode =
                               documentNode.Elements()
                                           .FirstOrDefault(e => e.Name.LocalName == "DocumentDescriptionText");
                           var metadataNode =
                               documentNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DocumentMetadata");
                           var registerActionNode =
                               metadataNode.Elements()
                                           .FirstOrDefault(e => e.Name.LocalName == "RegisterActionDescriptionText");

                           return new object[]
                               {
                                   (string)
                                   documentNode.Parent.Parent.Elements()
                                               .FirstOrDefault(e => e.Name.LocalName == "DocumentIdentification"),
                                   (DateTime?)
                                   receivedDateNode.Elements().FirstOrDefault(e => e.Name.LocalName == "DateTime"),
                                   descriptionNode != null ? descriptionNode.Value.Trim() : string.Empty,
                                   registerActionNode != null ? registerActionNode.Value.Trim() : string.Empty
                               };
                       }
                       catch (Exception e)
                       {
                           //Log.error("");
                           return new object[] {};
                       }
                   }).ToArray();

        }
于 2013-10-29T15:15:22.690 回答
0

如果要在循环中处理错误并继续处理,也可以yield returnIEnumerable方法内部使用来处理每个结果,类似于此处的模式https://stackoverflow.com/a/32656320/1037948

于 2015-09-18T16:23:04.907 回答