全局的异常捕获过滤器 区分ajax请求 与浏览器导航请求

全局的异常捕获过滤器 区分ajax请求 与浏览器导航请求

建一个类ExceptionAttribute 继承 HandleErrorAttribute

重写OnException 方法

里面代码:

//1.0日志记录(文本日志和数据库日志)
//拿到日志
Exception exe= filterContext.Exception;
//获取当前exe的最详细信息
Exception inexe = exe.InnerException==null ? exe:exe.InnerException;
while (inexe.InnerException!=null)
{
inexe = inexe.InnerException;
}
//文本日志的缺点:不方便查询和统计
//数据库日志缺点:一个表的数据量将来会很大,频繁访问数据库(队列)
//Log4Net.dll组件
//
//3.0 将详细异常写入到系统日志中 :大家注意:真正的项目中使用的是日志组件,开源的有Log4Net
//日志的记录常用的有:1、记住到文本文件中(没有统计意义的,但是量又大的) 2、记录到数据库中(出异常报表一定记录到db中)
System.IO.File.AppendAllText(filterContext.HttpContext.Server.MapPath("/Logs/Log.txt"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "=" + inexe.ToString() + " ");
//其实就是告诉MVC来处理 就会按照web。config 里面跳转views/shared/error.cshtml 所以不能给异步对象 异步对象只能json格式
//2.0判断当前请求是被ajax请求的还是被浏览器导航请求的
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
//返回json格式
JsonResult jsonre = new JsonResult();
jsonre.Data = new { status = 1, msg = inexe.Message };
jsonre.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
filterContext.Result = jsonre;
//告诉mvc我已经处理了异常信息 你不需要处理了
filterContext.ExceptionHandled = true;
}
else
{
//告诉mvc导航到错误页面
filterContext.ExceptionHandled = false;
}
base.OnException(filterContext);


---------

MVC自己处理的 base.OnException(filterContext); 就是这个作用

filterContext 是传给 错误页面的 Model @model HandleErrorInfo

Web.config 里面设置 开发过程 想看详细异常信息 就
<customErrors mode="RemoteOnly" 就是出 黄页 内容

<system.web>
<customErrors mode="On" defaultRedirect="Error"></customErrors>

On 不管远程和本地访问 都显示友好页面
Of 不管远程和本地访问 都显示黄页
RemoteOnly 远程访问 显示友好页面 本地显示黄页


在App_Start 里的FilterConfig 里面注册

filters.Add(new ExceptionAttribute());//注册全局过滤器

-----
重点是 看日志 因为 发布后不可能开VS 看异常信息

人的本事不是与生俱来的,不是你掌握了多少,而是当你面对一个未知问题的时候,你能用多少时间来掌握!
原文地址:https://www.cnblogs.com/dianshen520/p/4349156.html