我正在使用全局操作过滤器来处理和记录所有异常。
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
类,以及名为General
和Http404
的 Action 。<customErrors mode ="On" defaultRedirect="Error/General">
<error statusCode="404" redirect="Error/Http404"/>
</customErrors>
我不明白的是,没有执行 Controller Action ojit_code(永远不会命中断点),但是当
General
的ExceptionContext.ExceptionHandled
方法开始执行时,OnException
的值设置为true。 最佳答案
发生异常时,全局过滤器的顺序执行in reverse order。这意味着HandleErrorAttribute
首先运行。
您可以查看HandleErrorAttribute
here的代码,但简而言之,它是:
ExceptionHandled
为false且启用了自定义错误的情况下执行。 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/