我有一种方法可以尝试使用 SharpSVN 将 n 个文件添加到存储库。任何数量的这些文件都可能引发错误,我捕获了该错误,然后转到下一个文件并尝试添加它,依此类推。我想提醒用户 X 次,其中 X 是不同原因的数量。因此,如果我添加了 5 个文件,其中 3 个由于一个原因而失败,而 2 个由于不同的原因而失败,我想呈现 2 个错误。如果它们都因相同的原因而失败,则为 1 个错误。五个不同的原因?提出 5 个错误。
我创建了一个FileException
具有两个属性(Exception
Ex、string
FileName)的类,并尝试实现一个集合,以便将其分组到异常中。
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% 有效。