捕捉处理全局异常
自定义一个Attribute
继承默认的HandleErrorAttribute
namespace EmpowerApiService.Filter
{
public class CustomerErrorAttribute : HandleErrorAttribute
{
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled) { return; }
var controllerName = (string)filterContext.RouteData.Values["controller"];
var actionName = (string)filterContext.RouteData.Values["action"];
var error = new {
message = filterContext.Exception.Message,
hresult = filterContext.Exception.HResult.ToString("X")
} ;
if (filterContext.HttpContext != null && filterContext.HttpContext.Request != null)
{
var requestUrl = filterContext.HttpContext.Request.Url.ToString();
var requestParams = filterContext.HttpContext.Request.Params;
var requestParamsStr = HttpUtility.UrlDecode(requestParams.ToString());
//
logger.Error(
filterContext.Exception,
"url: {0}, params: {1}",
new Object[] {requestUrl, requestParamsStr });
}
filterContext.ExceptionHandled = true;
// request side error
if (filterContext.Exception is ArgumentException)
{
filterContext.HttpContext.Response.StatusCode = 400;
}
// server side error
else
{
filterContext.HttpContext.Response.StatusCode = 500;
}
// build http response
filterContext.Result = new JsonResult() { ContentType = "applicaltion/json", ContentEncoding = System.Text.Encoding.UTF8, Data = error, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
}
}
注册自定义的处理类,使之生效,替换默认的错误处理,修改APP_Start
中的FilterConfig.cs
namespace EmpowerApiService
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new EmpowerApiService.Filter.CustomerErrorAttribute());
}
}
}
在需要使用错误处理的Controller
或Action
上使用特性,就可以捕捉并处理异常
using EmpowerApiService.Filter;
namespace EmpowerApiService.Controllers{
[CustomerError]
public class xxxController : Controller{ ... }
}