版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pan_junbiao/article/details/84565988
ASP.NET MVC使用Exception过滤器处理异常,Exception过滤器只在另一个过滤器、动作方法、动作结果弹出异常时运行。
示例:使用Exception过滤器处理异常信息。
创建MyHandleErrorAttribute类,继承HandleErrorAttribute类:
using System;
using System.IO;
using System.Text;
using System.Web.Mvc;
namespace MvcApp.Filter
{
/// <summary>
/// 异常处理过滤器
/// </summary>
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//1、获取异常对象
Exception ex = filterContext.Exception;
//2、获取请求的类名和方法名
string strController = filterContext.RouteData.Values["controller"].ToString();
string strAction = filterContext.RouteData.Values["action"].ToString();
//3、记录异常日志
string errMsg = String.Format("控制器:{0};Action:{1};异常信息:{2};", strController, strAction, ex.ToString());
WriteLog(errMsg);
//4、重定向友好页面
filterContext.Result = new RedirectResult("~/error.html");
//5、标记异常已经处理完毕
filterContext.ExceptionHandled = true;
base.OnException(filterContext);
}
/// <summary>
/// 写入日志
/// </summary>
public void WriteLog(string message)
{
string path = AppDomain.CurrentDomain.BaseDirectory + "/MyLog.txt";
using (StreamWriter sw = new StreamWriter(path, true, Encoding.Default))
{
sw.Flush();
sw.WriteLine("时间:" + DateTime.Now);
sw.WriteLine("内容:" + message);
sw.WriteLine("-------------------------");
}
}
}
}
在Action上面添加MyHandleError过滤器:
[MyHandleError]
public ActionResult GetErr()
{
int a = 0;
int b = 1 / a;
return View();
}
创建异常错误友好提示页面error.html。
<body>
自定义错误页面
</body>
运行会自动跳转到error.html页面。
如果页面没有跳转,就需要去Web.config配置文件中的<system.web>节点下面添加如下配置节点,开启自定义错误:
<customErrors mode="On"></customErrors>
通常这样的异常处理是放在全局过滤器上面的,只要任意Action方法报错就会执行MyHandleError过滤器中的代码。
修改App_Start目录下面的FilterConfig类:
using System.Web;
using System.Web.Mvc;
using MvcApp.Filter;
namespace MvcApp
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
//添加全局异常处理过滤器
filters.Add(new MyHandleErrorAttribute());
}
}
}
Global.asax下的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace MvcApp
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}