ExceptionContext.ExceptionHandled changes to true. Where is the exception being handled?

前端 未结 1 738
鱼传尺愫
鱼传尺愫 2021-01-02 16:02

I\'m using a global action filter to handle and log all exceptions.

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
               


        
相关标签:
1条回答
  • 2021-01-02 16:07

    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:

    1. Only executes if ExceptionHandled is false, and custom errors are enabled.
    2. Sets up a redirect to the error view, which by default is called Error.
    3. Sets 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.

    0 讨论(0)
提交回复
热议问题