標籤:erro 擷取 動作 ora ase tsp exce views man
mvc異常處理
using System;using System.Configuration;using System.Web.Mvc;using Infrastructure.Exceptions;using log4net;namespace Infrastructure.Web.ActionFilters{ /// <summary> /// 統一處理Mvc網站異常過濾器 /// </summary> public class UnifyMvcSiteHandleErrorAttribute: HandleErrorAttribute { private static readonly ILog Log = LogManager.GetLogger(typeof(UnifyMvcSiteHandleErrorAttribute)); public readonly string BootStrapError = "~/Views/Shared/BootStrapError.cshtml"; public MVCResultType MVCResultType { set; get; } public override void OnException(ExceptionContext filterContext) { if (filterContext == null || filterContext.ExceptionHandled) return; Log.Error(filterContext.Exception.GetFriendlyMessage(),filterContext.Exception); if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest()) { HandleAjaxRequestError(filterContext); } else if(filterContext.Exception.IsTipException()) { HandleRequestWithTipException(filterContext); } base.OnException(filterContext); } /// <summary> /// 處理Ajax請求產生的錯誤 /// </summary> /// <param name="filterContext"></param> private void HandleAjaxRequestError(ExceptionContext filterContext) { var message = GetMessage(filterContext.Exception); filterContext.Result = BuildActionResultWithErrorMessage(filterContext, message); filterContext.HttpContext.Response.StatusCode = 200; filterContext.ExceptionHandled = true; } /// <summary> /// 構建包含錯誤資訊的動作結果 /// </summary> /// <param name="filterContext"></param> /// <param name="message"></param> /// <returns></returns> private ActionResult BuildActionResultWithErrorMessage(ExceptionContext filterContext, string message) { var actionName = (string) filterContext.RouteData.Values["action"]; if (MVCResultType == MVCResultType.PartialHtml || actionName.EndsWith("Partial")) { return new ContentResult() {Content = message}; } if (MVCResultType == MVCResultType.BootStrapModal) { return new PartialViewResult() { ViewName = BootStrapError, ViewData = new ViewDataDictionary<string>(message) }; } return new JsonResult() { Data = new {success = false, message, flag = false, msg = message}, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; } /// <summary> /// 擷取提示資訊 /// </summary> /// <param name="exception"></param> /// <returns></returns> private string GetMessage(Exception exception) { if (exception.IsTipException()) { return GetTipMessage(exception); } if (ConfigurationManager.AppSettings["HideErrorToUser"] == "true") { return "Web內部異常,請聯絡系統管理員。"; } return exception.GetFriendlyMessage(); } /// <summary> /// 處理出現提示類異常的請求 /// </summary> /// <param name="filterContext"></param> private void HandleRequestWithTipException(ExceptionContext filterContext) { var tipMessage = GetTipMessage(filterContext.Exception); filterContext.Result = new ViewResult() { ViewName = "Tip", MasterName = string.Empty, ViewData = new ViewDataDictionary<string>(tipMessage) }; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; } private string GetTipMessage(Exception exception) { if (exception is System.Web.HttpRequestValidationException) { return "請您輸入合法字元。"; } if (exception is TipInfoException) { return exception.Message; } return null; } } /// <summary> /// MVC動作結果類型 /// </summary> public enum MVCResultType { /// <summary> /// 沒有指定 /// </summary> NotSpecify = 0, /// <summary> /// Html片段 /// </summary> PartialHtml = 1, /// <summary> /// 彈出框 /// </summary> BootStrapModal = 2 }}
統一的mvc異常處理