Get a flat list of exception and inner exception error messages

Posted written by Paul Seal on October 21, 2015 C#

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