【发布时间】:2013-11-23 17:28:45
【问题描述】:
我有一个方法尝试使用 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 抛出相同。
所以我认为我在 AddFiles 方法中使用 GroupBy() 的方式存在问题,但我在这里完全一无所知。哦,另外,我在我的 GroupBy() 声明中收到了 Resharper 的这条注释:Return value of pure method is not used,但我不太确定“纯方法”是什么意思。
编辑:我刚刚尝试使用 OrderBy 而不是 GroupBy,但对于上述测试用例,我得到了相同的结果。
编辑 2:使用我的 OrderBy 而不是 GroupBy,这是我的即时窗口的屏幕截图: ![在此处输入图片描述][1]
添加突出显示只是为了更容易区分三行。
项目 0 和 2 是否应该放在一起,因为它们的 Ex 是同一类型?
编辑 添加 Gert Arnold 答案的屏幕截图以表明它无法编译。我提出了一个确实编译的编辑,它被删除了。当然,我感谢他的帮助,但它并不是 100% 有效。
【问题讨论】: