一、自定义错误页面

有些时候,我们想使用自定义的错误页面,该怎么处理那。

翻页其他大牛写的博客,看到有这种方式,自定义属性Class继承FileterAttribute,

重写OnException方法,代码如下

public class MyErrorAttribute: HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//获取异常对象
Exception ex = filterContext.Exception;
//记录错误日志

//记录出现错误的IP地址
string strIP = filterContext.HttpContext.Request.UserHostAddress;
string strUser = System.Environment.MachineName; ;
string strPath = filterContext.HttpContext.Request.Path;

StringBuilder sb = new StringBuilder();
sb.Append("IP:【" + strIP + "】" + Environment.NewLine);
sb.Append("UserName:【" + strUser + "】" + Environment.NewLine);
sb.Append("Action:【" + strPath + "】" + Environment.NewLine);
sb.Append("Error in 【" + filterContext.HttpContext.Request.Url.ToString() + "】" + Environment.NewLine);
sb.Append("Error Message 【" + ex.Message + "】" + Environment.NewLine);
sb.Append("Browser 【" + filterContext.HttpContext.Request.Browser.Browser + "||");
sb.Append(filterContext.HttpContext.Request.Browser.Id + "||");
sb.Append(filterContext.HttpContext.Request.Browser.Version + "||");
sb.Append(filterContext.HttpContext.Request.Browser.Beta + "】");
//记录错误
WriteError(sb.ToString());

//导向友好错误界面
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(
new
{
controller = "Error",
action = "Page404",
returnUrl = filterContext.HttpContext.Request.Url,
returnMessage = "页面不存在!"
}
));


//重要!!!告诉系统异常已经处理!!
//如果没有这个步骤,系统还是会按照正常的异常处理流程做
filterContext.ExceptionHandled = true;

//base.OnException(filterContext);
}


1、记录错误信息


/// <summary>
/// 用于将错误信息输出到txt文件
/// </summary>
/// <param name="errorMessage">错误详细信息</param>
public static void WriteError(string errorMessage)
{
try
{
string path = "~/Error/" + DateTime.Today.ToString("yyMMdd") + ".txt";
if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(path)))
{
File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close();
}
using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path)))
{
w.WriteLine("\r\nLog Entry : ");
w.WriteLine("DateTime 【{0}】", DateTime.Now.ToString(CultureInfo.InvariantCulture));
w.WriteLine(errorMessage);
w.WriteLine("***********************************************************************************************");
w.Flush();
w.Close();
}
}
catch (Exception ex)
{
WriteError(ex.Message);
}
}


网上大神写的,他分得比较的细:

public class BaseHandleErrorAttribute : FilterAttribute, IExceptionFilter
{
public void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled == true)
{
HttpException httpExce = filterContext.Exception as HttpException;
if (httpExce != null && httpExce.GetHttpCode() != 500)//为什么要特别强调500 因为MVC处理HttpException的时候,如果为500 则会自动将其ExceptionHandled设置为true,那么我们就无法捕获异常
{
return;
}
}
Exception exception = filterContext.Exception;
if (exception != null)
{
HttpException httpException = exception as HttpException;
if (httpException != null)
{
//网络错误
filterContext.Controller.ViewBag.UrlRefer = filterContext.HttpContext.Request.UrlReferrer;
int DataEroorCode = httpException.GetHttpCode();
if (DataEroorCode == 404)
{
filterContext.HttpContext.Response.Redirect("~/SysError/404");
}
else if (DataEroorCode == 500)
{
filterContext.HttpContext.Response.Redirect("~/SysError/500");
}
else
filterContext.HttpContext.Response.Redirect("~/SysError/" + DataEroorCode);

//写入日志 记录
filterContext.ExceptionHandled = true;//设置异常已经处理
}
else
{
//编程或者系统错误,不处理,留给HandError处理
}
}
}
}