MVC 使用HandleErrorAttribute统一处理异常

    HandleErrorAttribute继承自FilterAttribute,且实现了IExceptionFilter接口。

    属于AOP思想的一种实现,MVC的四大筛选器(权限,动作,结果,异常)中的异常处理。

    Points:

    1)ExceptionHandled为true,表明异常已经处理,不再被拦截;反之,可能被再次拦截;

    2)通过设置ExceptionContext的Result(ActionResult类型)属性,表明结束当前请求

Usage

1.创建自定义异常处理

public class AppHandleErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        var json = new JsonResponse();
        json.success = false;
        var ex = filterContext.Exception;
        //deal custom exception…
        json.message = "系统异常,请联系管理员!";
        string msg = string.Format("系统异常:{0}", ex.Message);
        LogHelper.Error(msg, ex);   //Log4jNet

        filterContext.ExceptionHandled = true;
        var result = new JsonResult();
        result.Data = json;
        result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        filterContext.Result = result;

        #region Sample Segment(样例)
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            JsonResult jsonResult = new JsonResult()
            {
                Data = ""
            };

            LogHelper.Error(filterContext.Exception.Message);

            filterContext.Result = jsonResult;
        }
        else
        {
            filterContext.Result = new RedirectResult("Error");
        }

        filterContext.ExceptionHandled = true;
        #endregion
    }
}

2.注册

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new AppHandleErrorAttribute());
    }
}

参考:http://www.cnblogs.com/linjiancun/archive/2010/09/16/1827937.html

3.使用

如果要运用AppHandleError拦截异常,则将Controller继承自BaseController即可。

[AppHandleError]
public abstract class BaseController : Controller
{
    //......
}
posted @ 2014-06-07 15:11  _DN  阅读(863)  评论(1编辑  收藏  举报