Debugging errors can be difficult, especially when you need to see the errors inside the errors.
This post shows you how you can get all errors as a collection of errors rather than them being hidden inside other errors.
You can create an extension method like this one:
using System;
using System.Collections.Generic;
namespace PaulSeal.Library.Utility
{
public static class Extensions
{
public static IEnumerable<Exception> FlattenHierarchy(this Exception ex)
{
if (ex == null)
{
throw new ArgumentNullException("ex");
}
var innerException = ex;
do
{
yield return innerException;
innerException = innerException.InnerException;
}
while (innerException != null);
}
}
}
It iterates through the errors and retrieves any innerExceptions until there are no more errors.
I only really use this for debugging as I wouldn't normally want the customer to see these error messages. Here is an example of it in use:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SubmitContactForm(ContactModel model)
{
if (!ModelState.IsValid) return CurrentUmbracoPage();
else
{
try
{
SendEmail(model);
TempData["EmailSuccess"] = true;
}
catch (Exception ex)
{
//use the extension method here to find all of the errors and output them to the validation summary.
ex.FlattenHierarchy().ToList().ForEach(x => ModelState.AddModelError("EmailError", x.Message));
return CurrentUmbracoPage();
}
return RedirectToCurrentUmbracoPage();
}
}
private void SendEmail(ContactModel model)
{
//some code for sending an email
}
I originally found this solution here