Browse Source

Show better error messages in the Add Package Reference dialog when an aggregate exception has an inner aggregate exception.

pull/15/head
Matt Ward 14 years ago
parent
commit
5ce9465f25
  1. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 43
      src/AddIns/Misc/PackageManagement/Project/Src/AggregateExceptionErrorMessage.cs
  3. 13
      src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs
  4. 45
      src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs

1
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -67,6 +67,7 @@ @@ -67,6 +67,7 @@
<Compile Include="Configuration\AssemblyInfo.cs" />
<Compile Include="Src\AcceptLicensesEventArgs.cs" />
<Compile Include="Src\AddPackageReferenceCommand.cs" />
<Compile Include="Src\AggregateExceptionErrorMessage.cs" />
<Compile Include="Src\Design\FakePackageManagementProject.cs" />
<Compile Include="Src\IAddPackageReferenceView.cs" />
<Compile Include="Src\IPackageFromRepository.cs" />

43
src/AddIns/Misc/PackageManagement/Project/Src/AggregateExceptionErrorMessage.cs

@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Text;
namespace ICSharpCode.PackageManagement
{
public class AggregateExceptionErrorMessage
{
AggregateException ex;
StringBuilder errorMessage = new StringBuilder();
public AggregateExceptionErrorMessage(AggregateException ex)
{
this.ex = ex;
BuildErrorMessage();
}
void BuildErrorMessage()
{
BuildErrorMessage(ex.InnerExceptions);
}
void BuildErrorMessage(IEnumerable<Exception> exceptions)
{
foreach (Exception ex in exceptions) {
var aggregateEx = ex as AggregateException;
if (aggregateEx != null) {
BuildErrorMessage(aggregateEx.InnerExceptions);
} else {
errorMessage.AppendLine(ex.Message);
}
}
}
public override string ToString()
{
return errorMessage.ToString().TrimEnd();
}
}
}

13
src/AddIns/Misc/PackageManagement/Project/Src/PackagesViewModel.cs

@ -6,7 +6,9 @@ using System.Collections.Generic; @@ -6,7 +6,9 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Windows.Input;
using NuGet;
namespace ICSharpCode.PackageManagement
@ -127,16 +129,17 @@ namespace ICSharpCode.PackageManagement @@ -127,16 +129,17 @@ namespace ICSharpCode.PackageManagement
base.OnPropertyChanged(null);
}
protected void SaveError(AggregateException ex)
void SaveError(AggregateException ex)
{
SaveError(ex.InnerException);
HasError = true;
ErrorMessage = GetErrorMessage(ex);
ICSharpCode.Core.LoggingService.Debug(ex);
}
protected void SaveError(Exception ex)
string GetErrorMessage(AggregateException ex)
{
HasError = true;
ErrorMessage = ex.Message;
var errorMessage = new AggregateExceptionErrorMessage(ex);
return errorMessage.ToString();
}
void UpdatePackagesForSelectedPage(PackagesForSelectedPageResult result)

45
src/AddIns/Misc/PackageManagement/Test/Src/PackagesViewModelTests.cs

@ -1080,6 +1080,51 @@ namespace PackageManagement.Tests @@ -1080,6 +1080,51 @@ namespace PackageManagement.Tests
Assert.AreEqual("Test", viewModel.ErrorMessage);
}
[Test]
public void ErrorMessage_BackgroundTaskHasAggregateExceptionWithNestedInnerAggregateException_ErrorMessageTakenFromInnerException()
{
CreateViewModel();
viewModel.AddSixFakePackages();
viewModel.ReadPackages();
Exception innerEx1 = new Exception("Test1");
Exception innerEx2 = new Exception("Test2");
AggregateException innerAggregateEx = new AggregateException(innerEx1, innerEx2);
AggregateException aggregateEx = new AggregateException(innerAggregateEx);
taskFactory.FirstFakeTaskCreated.Exception = aggregateEx;
taskFactory.FirstFakeTaskCreated.IsFaulted = true;
CompleteReadPackagesTask();
string expectedErrorMessage =
"Test1\r\n" +
"Test2";
Assert.AreEqual(expectedErrorMessage, viewModel.ErrorMessage);
}
[Test]
public void ErrorMessage_BackgroundTaskHasAggregateExceptionWithTwoInnerExceptionsWhenItFinishes_ErrorMessageTakenFromAllInnerExceptions()
{
CreateViewModel();
viewModel.AddSixFakePackages();
viewModel.ReadPackages();
Exception innerEx1 = new Exception("Test1");
Exception innerEx2 = new Exception("Test2");
Exception innerEx3 = new Exception("Test3");
AggregateException aggregateEx = new AggregateException(innerEx1, innerEx2, innerEx3);
taskFactory.FirstFakeTaskCreated.Exception = aggregateEx;
taskFactory.FirstFakeTaskCreated.IsFaulted = true;
CompleteReadPackagesTask();
string expectedErrorMessage =
"Test1\r\n" +
"Test2\r\n" +
"Test3";
Assert.AreEqual(expectedErrorMessage, viewModel.ErrorMessage);
}
[Test]
public void HasError_ErrorMessageDisplayedAndReadPackagesRetriedAfterFailure_ReturnsFalse()
{

Loading…
Cancel
Save