· 2 min read

Get a flat list of exception and inner exception error messages

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

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

Comments and reactions