利用特性捕获异常

交给我一个老项目,让我修改Bug。我查看了错误日志,确实有好多bug。但是经我仔细查看,这些错误其实都不算错误,就是在合法验证的时候,发现不合法的数据,采用了抛异常的方法,所以这些数据验证都这么莫名其妙的写到错误日志里了。我想能不能有办法修改一下这种写法,可是我发现一个奇怪的现象:只要检测到数据不合格,抛异常,然后就返回到了前端,而且前端接收到的不是500,而是200,并且错误原因说得很正确。这说明后台代码是进行过异常处理的,可是我花了半天时间去查找捕获这些异常的地方。最终在控制器上发现了一个特性:

[NoHandleError]

我将这个特性注释,并采用平时捕获错误的方法,终于捕获到错误,但是这个时候前端返回的是500,而不是200。到这里我可以肯定,是这个特性对异常进行了捕获,并对返回结果做了处理。可以它从哪里来呢?经过查找,这是一个同事写的nuget包,要想看源码,只能反编译。

这个时候我冷静下来,bug其实已经改不了了,它就是一种写法,而不是错误。如果我要改,基本要把这些地方重新做一遍,对于这些老项目,代价太大,犯不上。此时,我更多的是对这种异常处理的好奇,统一捕获并返回信息,客户端接收到的是200而不是500。

特性这个东西,不经常写,我先研究 一下。

再就是通过特性捕获异常,我再研究一下。

接下来就是捕获到异常后将信息写入response。

写入response之后,发现还有一个问题,那就是客户端是接收到信息了,但是接收到的状态码是500。还不对。

经过我不断研究,发现这么一行代码至关重要:

只要把这个值标记为true,表示 异常已经被处理,客户端接收到的就是200了。到此,这个问题就解决了。

    public class CatchErrorAttribute : System.Web.Mvc.HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            base.OnException(filterContext);
            string errMessage = filterContext.Exception.Message;//错误信息
            filterContext.Result = new JsonResult() { Data = new { message = errMessage, success = false }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };//将返回信息重写
            filterContext.ExceptionHandled = true;//标记错误已经处理,这个很重要,如果不标记,那么客户端接收到服务端抛异常的反馈(500),如果标记,客户端接收到的是服务端正常处理的反馈(200)
        }
    }

测试代码:

[CatchErrorAttribute]
    public class HomeController : Controller
    {public ActionResult Test()
        {
            object result = new object();
            result = Execute();
            return Json(result);
        }

        public object Execute()
        {
            int i = 0;
            int t = 9;
            var temp = 0;
            try
            {
                temp = t / i;
            }
            catch (Exception e)
            {
                throw e;
            }return temp;
        }
    }

 前端:

<script type="text/javascript">

    $.ajax({
        url: '/Home/Test' ,
        type: 'post',
        data: {},
        success: function (data) {
            debugger;
        },
        error: function (data) {
            debugger;
        }
    })
</script>

 到此,这个功能就研究完毕了。

这个问题我主要研究的几个点:

1、特性

2、特性中捕获异常

3、将异常信息写入Response

4、将异常信息标记为已处理(长知识了)

这些东西都是平时不常用的,或者说常用但是又是给包装好不直接使用的。归根究底还是基础不好。如果就像sql一样,不管你是lambda还是linq,反正我会用sql。sql才是根,碰上性能为题,还得sql解决。特性、捕获异常、Response,都是很基础的东西,我应该补补课。

posted on 2018-04-10 16:39  木头人段  阅读(161)  评论(0编辑  收藏  举报

导航