1

我有一种方法可以尝试使用 SharpSVN 将 n 个文件添加到存储库。任何数量的这些文件都可能引发错误,我捕获了该错误,然后转到下一个文件并尝试添加它,依此类推。我想提醒用户 X 次,其中 X 是不同原因的数量。因此,如果我添加了 5 个文件,其中 3 个由于一个原因而失败,而 2 个由于不同的原因而失败,我想呈现 2 个错误。如果它们都因相同的原因而失败,则为 1 个错误。五个不同的原因?提出 5 个错误。

我创建了一个FileException具有两个属性(ExceptionEx、stringFileName)的类,并尝试实现一个集合,以便将其分组到异常中。

    public void AddFiles(List<string> files)
    {
        var sb = new StringBuilder();
        var args = new SvnAddArgs {Depth = SvnDepth.Children};
        var exes = new Collection<FileException>();

        foreach (var file in files)
        {
            try
            {
                //only here for testing purposes described below
                if (file.Contains("png"))
                    throw new AccessViolationException();

                SVNClient.Add(file, args);
            }
            catch (Exception ex)
            {
                exes.Add(new FileException(ex, file));
            }
        }

        if (exes.Count > 1)
        {
            exes.GroupBy(s => s.Ex.GetType());
            Unique<Log>.Instance.AddExceptions(exes);
        }
        else if (exes.Count == 1)
            Unique<Log>.Instance.AddException(exes[0].Ex);
    }

    public void AddExceptions(Collection<FileException> e)
    {
        var sb = new StringBuilder();
        var ex = e[0].Ex;

        for(var i=0; i < e.Count;i++)
        {
            Logs.Add(new LogMessage(e[i].Ex));
            sb.AppendLine(e[i].FileName);
            WriteLogFile(new LogMessage(e[i].FileName, e[i].Ex));

            if (ex.GetType() == e[i].Ex.GetType()) 
                continue;

            ShowLogError(new LogMessage(sb.ToString(), ex));
            sb.Length = 0;
            ex = e[i].Ex;
        }

//Call ShowLogError if only 1 type of Exception in all of e
        if (!string.IsNullOrEmpty(sb.ToString())) 
            ShowLogError(new LogMessage(sb.ToString(), ex));
    }

    public void ShowLogError(ILogMessage log)
    {
        //Extra formatting left out as its irrelevant to code sample
        XtraMessageBox.Show(log.message, log.title);
    }

因此,AddException尝试做的是将第一个异常存储在ex某种标志中,然后迭代其参数并在当前项与标志项不同时向用户发送消息。

测试用例:

  • 添加 3 个文件(fileA.cs、fileB.png、fileC.cs)

预期成绩:

  • ShowLogError() 向我显示了 fileA 和 fileC,因为它们引发了相同的错误
  • ShowLogError() 显示了 fileB,它引发了硬编码异常,因为它包含“png”

实际结果:

  • ShowLogError() 显示文件 A 和 B,它们引发了 2 个不同的异常
  • ShowLogError() 显示 fileC,它与 fileA 抛出相同。

所以我认为我GroupBy()在 AddFiles 方法中的使用方式存在问题,但我在这里完全一无所知。哦,另外,我从 Resharper 那里得到了关于我的GroupBy()声明的注释:Return value of pure method is not used但我不太确定“纯方法”是什么意思。

编辑:我刚刚尝试使用 OrderBy 而不是 GroupBy,但对于上述测试用例,我得到了相同的结果。

编辑 2:使用我的 OrderBy 而不是 GroupBy,这是我的即时窗口的屏幕截图:![在此处输入图像描述][1]

添加突出显示只是为了更容易区分三行。

项目 0 和 2 是否应该放在一起,因为它们Ex属于同一类型?

编辑添加 Gert Arnold 答案的屏幕截图以显示它无法编译。我提出了一个可以编译的编辑,它被删除了。当然,我感谢他的帮助,但它并不是 100% 有效。 在此处输入图像描述

4

2 回答 2

1

我相信您没有捕获“GroupBy”或“OrderBy”子句的结果。

那这个呢:

        List<Type> types = exes.Select(x => x.GetType()).Distinct().ToList();

这为您提供了添加到集合中的独特类型的 FileExceptions

于 2013-11-11T20:59:48.297 回答
1

当您拥有exes收藏品时,基本上您所要做的就是:

var result = fileExceptions.GroupBy(e => e.Ex.GetType().Name)
    .Select(g => new 
        { 
          g.Key, Files = string.Join("\r\n", g.Select(x => x.FileName).ToArray())
        });
于 2013-11-11T23:31:00.597 回答