I\'m using a global action filter to handle and log all exceptions.
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
When an exception occurs, the order of the global filters executes in reverse order. This means that HandleErrorAttribute
runs first.
You can view the code of HandleErrorAttribute
here, but in short, it:
ExceptionHandled
is false, and custom errors are enabled.Error
.ExceptionHandled
to true.As it's the first filter, then ExceptionHandled
is false when it executes, causing it to set the view to Error and setting ExceptionHandled
to true. So, then, when your own filter executes, that is why ExceptionHandled
is already set to true. Note that if custom errors were disabled, then ExceptionHandled
would still be false, as HandleErrorAttribute
wouldn't have done its stuff. In this case, ELMAH will log the error anyway, as it's unhandled (yellow screen of death), so the test in your class is to prevent duplicate logging of the error.
Now, on to your other question about whey the General
action isn't executed, the defaultRedirect
is only used if the filters don't set some explicit redirect themselves, so it's actually ignored when an exception occurs inside an ActionMethod and you have the global filter HandleErrorAttribute
registered. It would however, be called if you entered a URL that didn't exist, i.e. an error that doesn't occur from within an ActionMethod. Also, if you comment out the line to register the HandleErrorAttribute
in Global.asax.cs, then you'll always get the General
controller action executing.