ASP.NET MVC使用Exception過濾器處理異常
阿新 • • 發佈:2018-11-28
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);
}
}
}