我正在使用全局操作过滤器来处理和记录所有异常。

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ElmahHandleErrorAttribute());
        filters.Add(new HandleErrorAttribute());
    }

这就是定义全局 Action 过滤器ElmahHandleErrorAttribute的方式-它覆盖了OnException方法。
public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
       //Is the exception handled already? context.ExceptionHandled seems to be true here
        if (!context.IsChildAction && (context.HttpContext.IsCustomErrorEnabled))
        {
            //Do other stuff stuff
            //Log to Elmah
        }
    }
   ...
 }

我不明白为什么执行context.ExceptionHandled方法时OnException的值为true。
如何处理此异常?

-EDIT-
我在customErrors中有一个Web.Config部分。我有一个ErrorController类,以及名为GeneralHttp404的 Action 。
<customErrors mode ="On" defaultRedirect="Error/General">
      <error statusCode="404" redirect="Error/Http404"/>
  </customErrors>

我不明白的是,没有执行 Controller Action oj​​it_code(永远不会命中断点),但是当GeneralExceptionContext.ExceptionHandled方法开始执行时,OnException的值设置为true。

最佳答案

发生异常时,全局过滤器的顺序执行in reverse order。这意味着HandleErrorAttribute首先运行。

您可以查看HandleErrorAttribute here的代码,但简而言之,它是:

  • 仅在ExceptionHandled为false且启用了自定义错误的情况下执行。
  • 设置到错误 View 的重定向,默认情况下称为Error
  • ExceptionHandled设置为true。

  • 由于它是第一个过滤器,因此ExceptionHandled在执行时为false,导致其将 View 设置为Error,并将ExceptionHandled设置为true。因此,当您执行自己的过滤器时,这就是ExceptionHandled已经设置为true的原因。请注意,如果禁用了自定义错误,则ExceptionHandled仍然为false,因为HandleErrorAttribute不会做任何事情。在这种情况下,ELMAH还是会记录错误,因为它没有得到处理(黄色的死亡屏幕),因此在您的类(class)中进行测试是为了防止重复记录错误。

    现在,关于另一个没有处理General Action 的问题,只有在过滤器本身未设置一些显式重定向的情况下才使用defaultRedirect,因此当ActionMethod内发生异常并且您拥有全局变量时,实际上会忽略HandleErrorAttribute。过滤器注册了HandleErrorAttribute。但是,如果您输入的URL不存在,即在ActionMethod中不会发生的错误,就会被调用。另外,如果您注释掉在Global.asax.cs中注册General的行,那么您将始终执行ojit_code Controller Action 。

    关于asp.net-mvc - ExceptionContext.ExceptionHandled更改为true。在哪里处理异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10597478/

    10-12 23:18