我通过在filterConfig注册中应用HandleError属性为应用程序启用了全局错误处理。
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
然后我使用自定义错误(web.config)来为每个服务器错误显示友好的错误消息。
<customErrors mode="On" ></customErrors>
这似乎适用于大多数异常,我得到了预期的行为,因为正在显示自定义错误页面View(共享视图文件夹中的Error.cshtml)。
但是我最近注意到,如果抛出的错误是UnauthorizedAccessException,这不是我看到的行为。
我对此感到有点难过,因为在fiddler中我看到这个UnauthorizedAccessException异常会返回一个普通的500内部服务器错误,因为标准异常会发生错误。
那么我的customError设置如何遵守标准异常但是UnauthorizedAccessException不会?
我怎样才能使它们表现相同,因为它们本质上都是一个我想阻止最终用户看到的错误。
答案 0 :(得分:1)
这篇博文向我提供了异常处理的概述,使我能够决定如何处理unauthorizedAccessException,这实际上意味着在Application_OnStart中处理它们。
http://prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc
出于我的目的,使用HandleErrorAttribute和全局Application_OnStart处理错误似乎没什么意义,所以出于我的目的,我认为最好处理Application_OnSTart中的所有内容,
答案 1 :(得分:0)
如果您只想强制“未处理”的异常(例如UnauthorizedAccessException
)通过正常的自定义错误页面,那么您可以覆盖控制器的OnException方法,类似于以下内容:
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
if (!filterContext.ExceptionHandled && filterContext.RequestContext.HttpContext.IsCustomErrorEnabled)
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
filterContext.Result = View("Error",
new HandleErrorInfo(filterContext.Exception, filterContext.GetCurrentControllerName(), filterContext.GetCurrentActionName()));
}
}
您引用的文章是更好地解释错误处理技术的绝佳资源,但也应予以考虑。