title: ASP.NET MVC 4 - Exception Handling Not Working
body: <p>When an error occurs in my ASP.NET MVC 4 application, I would like to customize a view for the user depending on the type of error.  For example, page not found or an exception has occurred (with some user-friendly details about the exception).  I've checked other examples of how to do this on StackOverflow and other online sources, but none of the answers are working for me.</p>
  
  <p>The basic [HandleError] attribute does not seem to be working in VS2012 with an MVC 4 application targeting .NET 4.5.  Here is the code I have in my home controller:</p>
  
  <pre><code>[HandleError]
  public ActionResult Index()
  {
      Response.TrySkipIisCustomErrors = true; //doesn't work with or without this
      throw new NullReferenceException("Uh oh, something broke.");
  }
  </code></pre>
  
  <p>It is just throwing an exception, and I would expect the default ~/Shared/Error.cshtml view to be returned because of the [HandleError] attribute, but all I get is an HTTP 500 Internal Server Error indicating that the page could not be displayed.  I checked my web.config, and different configurations seem to be behaving weird.  In the  section, it currently contains:</p>
  
  <pre><code>&lt;customErrors mode="On" /&gt;
  </code></pre>
  
  <p>(I've tried adding defaultRedirect and with customErrors mode="Off" as well but that didn't have any effect... neither the shared Error view or the CustomError view I have is being rendered.  If I change customErrors mode to off, then I can see the exception details as expected, so it is throwing the "Uh oh, something broke" exception properly.</p>
  
  <p>I've also tried adding an OnException handler to the HomeController, and although I can debug through and see that the OnException event is being raised, it doesn't make any difference:</p>
  
  <pre><code>protected override void OnException(ExceptionContext filterContext)
  {
      base.OnException(filterContext);
      filterContext.ExceptionHandled = true;
      if (filterContext == null)
      {
          filterContext.Result = View("CustomError");
          return;
      }
      Exception e = filterContext.Exception;
      // TODO: Log the exception here
      ViewData["Exception"] = e; // pass the exception to the view
      filterContext.Result = View("CustomError");
  }
  </code></pre>
  
  <p>I have also tried changing [HandleError] to specify a view, but that doesn't seem to do anything either:</p>
  
  <pre><code>[HandleError(View="CustomError")]
  </code></pre>
  
  <p>Any help would be much appreciated.  Please let me know if you need any more details.</p>