我希望使用名为HandleErrorAttribute
之类的新版本覆盖HandleErrorsWithLogging
。基本上,我希望它将未处理的异常记录到我的日志文件中,然后继续使用HandleError
获得的典型“重定向到〜/共享/错误”功能。
我已将HandleError
添加到global.asax
这是最好的方法还是有一些更简单的方法来获取对未记录的异常进行日志记录?我还有关于Error视图本身的Ajax调用。
答案 0 :(得分:6)
您可以创建一个继承自FilterAttribute的自定义过滤器,并实现IExceptionFilter。然后在global.asax.cs中注册它。您还必须在web.config中启用自定义错误处理:
<customErrors mode="On"/>
public class HandleErrorAndLogExceptionAttribute : FilterAttribute, IExceptionFilter
{
/// <summary>
/// The method called when an exception happens
/// </summary>
/// <param name="filterContext">The exception context</param>
public void OnException(ExceptionContext filterContext)
{
if (filterContext != null && filterContext.HttpContext != null)
{
if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))
{
// Log and email the exception. This is using Log4net as logging tool
Logger.LogError("There was an error", filterContext.Exception);
string controllerName = (string)filterContext.RouteData.Values["controller"];
string actionName = (string)filterContext.RouteData.Values["action"];
HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
// Set the error view to be shown
ViewResult result = new ViewResult
{
ViewName = "Error",
ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
TempData = filterContext.Controller.TempData
};
result.ViewData["Description"] = filterContext.Controller.ViewBag.Description;
filterContext.Result = result;
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
}
}
}
答案 1 :(得分:1)
覆盖HandleError
属性确实是处理此问题的一种方法。还有其他方法。另一种方法是使用ELMAH来处理这个问题,这样你就不用担心记录了。另一种方法是从HandleError
中删除任何Global.asax
全局过滤器,并订阅比Application_Error
更通用的HandleError
,因为它还会拦截在{{1}}之外发生的异常。 MVC管道。这是an example这样的处理。