.net mvc中封装了一些特性可以实现AOP,如常用的HandleErrorAttribute,ActionFilterAttribute,AuthorizeAttribute。自定义一个特性,继承这些特性,并重写里面的方法就可以AOP切入到Action中的关注点。本篇文章主要对笔者在使用HandleErrorAttribute的过程中遇到的一个问题进行分享。
我们在action中会用try..catch..进行异常处理,笔者在catch中返回一个json(标示失败)。我发现所有的action在catch中返回值都一样,所以就想到使用HandleErrorAttribute进行异常捕获,然后返回自定义的json。但是发现我在OnException方法中已经设置了filterContext.Result为我想要返回的值了,但是运行时还是报错,并没有返回我处理后返回的json。如果你也遇到这样的问题,添上一句话就OK了,那就是:filterContext.ExceptionHandled = true;
这是为什么呢?可能你看到这里已经恍然大悟了,那就是你要把ExceptionHandled这个表示设置为true,意思也就是我已经处理过了这个异常。这时候,浏览器一看,哦~已经处理了异常了,就输出你要的json了,如果你不设置成true,浏览器一看,还是没有Handed的异常,就给你报出来了。