我正在使用全局操作过滤器来处理和记录所有异常。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ElmahHandleErrorAttribute());
filters.Add(new HandleErrorAttribute());
}
这就是全局动作过滤器的方式ElmahHandleErrorAttribute
被定义 - 它覆盖OnException
method.
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
方法执行。
这个异常是如何处理的?
-EDIT-我有一个customErrors
部分中的Web.Config
。我有一个ErrorController
类和动作称为General
and Http404
.
<customErrors mode ="On" defaultRedirect="Error/General">
<error statusCode="404" redirect="Error/Http404"/>
</customErrors>
我不明白的是,控制器的动作General
未执行(从未命中断点),但值ExceptionContext.ExceptionHandled
设置为 true 时OnException
的方法ElmahHandleErrorAttribute
开始执行。
当异常发生时,全局过滤器的执行顺序以相反的顺序。这意味着HandleErrorAttribute
首先运行。
您可以查看代码HandleErrorAttribute
here,但简而言之,它:
- 仅执行如果
ExceptionHandled
为 false,并且启用自定义错误。
- 设置到错误视图的重定向,默认情况下称为
Error
.
- Sets
ExceptionHandled
为真。
因为它是第一个过滤器,所以ExceptionHandled
执行时为 false,导致其将视图设置为 Error 并设置ExceptionHandled
为真。那么,当你自己的过滤器执行时,这就是为什么ExceptionHandled
已设置为 true。请注意,如果禁用自定义错误,则ExceptionHandled
仍然是假的,因为HandleErrorAttribute
不会做它的事情。在这种情况下,ELMAH 无论如何都会记录错误,因为它未处理(黄色死屏),因此类中的测试是为了防止重复记录错误。
现在,关于乳清的另一个问题General
动作没有被执行,defaultRedirect
仅当过滤器本身未设置某些显式重定向时才使用,因此当 ActionMethod 内部发生异常并且您拥有全局过滤器时,它实际上会被忽略HandleErrorAttribute
挂号的。但是,如果您输入的 URL 不存在(即 ActionMethod 中未发生错误),则会调用该函数。另外,如果您注释掉注册的行HandleErrorAttribute
在 Global.asax.cs 中,那么你总是会得到General
控制器动作执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)