欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA 后台全局异常控制

程序员文章站 2022-03-28 10:21:27
...

一、为什么要进行异常控制

为什么要进行异常控制,在我们开发中,异常是最常见的问题,也是最不愿意看见的问题。但是我们也不得不看见,利用好异常能使我们快速成长,也能让开发人员快速定位异常,设计好了异常控制,能控制到这个异常是由谁产生的,何时产生的,产生的数据是什么,异常的方法是哪个,异常信息是什么等等,当我们利用好这些异常信息和数据,能让我们在开发过程中节约一部分时间和找问题的时间。
二、异常重现

例子1:我们在开发过程中,开发完成,对接也完成了,有一些异常还是会出来,而且这种异常是不定出现,可能这次操作出现异常,下次一样的操作就不会出现异常,这种异常在我们进行对接调试的时候非常麻烦,调试这个异常需要花费很长的时间。
例子2:我们在进行开发的时候,我们在进行对接调试的时候,日志会滚动很快,即使有异常也很难定位到异常信息位置,这样就会导致开发人员在定位异常上面花费时间,重新去点击这个异常出现,进行调试,这样也很花费时间。
例子3:当应用进行上线后,测试很科学,也没有发现任何异常,但是有的异常很奇怪,莫明的出现,这个时候我们就得去翻日志,在最开始的时候日志系统会全盘开着,每天可能就是多少个G的日志,要从中去找异常那犹如就是大海捞针,费神又费力。
有了这个异常控制以后,我们就可以在异常里面快速定位这个异常,异常的参数是什么,异常的异常信息是什么,如果根据异常信息读取找出问题所在方法和行数,如果实在找不出来,直接进行异常参数自我验证,找出异常原因,从而进行异常重现。
三、实现原理

1、整合spring实现异常拦截

         实现spring的接口HandlerExceptionResolver重写resolveException该方法,配置bean为<bean id="exceptionResolver" class="com.xxx.xxx.xxExceptionHandler"/>,r如果采用注解,直接在类xxExceptionHandler注解@Component即可。该方法提供了几个参数,参数为:
(一)HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息
(二)HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。查看HttpServletResponse的API,可以看到这些相关的方法。
(三)Object对象包含了该请求的方法所有信息,通过这个对象提供的方法,可以获取到请求的控制器和方法。
(四)Exception对象包含了该请求的异常信息,通过这个对象可以获取到异常信息。
2、信息提取

在这一步非常的重要,数据提取好了可以直接定位异常,所以下一步说明数据提取。
(一)获取请求链接:
String url = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getServletPath();
(二)获取服务器IP
String serviceIp = request.getLocalAddr();
(三)获取客户端IP
String clientIp = request.getRemoteAddr();
(四)获取请求类型
String httpMethod = request.getScheme();
(五)获取字符集
String charEncoding = request.getCharacterEncoding();
(六)获取请求参数
Map<String, String[]> parameters = request.getParameterMap();
参数可以后期加工,是用JSON呢还是拼接成请求链接呢,都是可以的。
(七)获取异常控制器+方法
前面所提的参数第三点,Object就是请求异常的控制器和方法,可以强转为HandlerMethod获取更多信息,例如获取到只有控制器完整结果,但是获取到的结果和直接Object没得多大区别,都能定位到方法去。
(八)获取异常信息
前面所提参数Exception就是异常信息,直接使用就可以了,这个里面包含了异常完整信息。
3异常重现方式

这些异常存储到数据库,在进行一些手段控制,直接定位该异常是某个开发人员,开发人员解决没有,解决的时间是多久,等等....。
可以做一个后台异常信息管理,查看异常信息,如果异常信息中查看不出来问题,可以直接浏览器模拟发送请求,进行异常重现调试,这样非常快捷,为开发人员节省异常调试时间。可能在前期做这个异常管理期间会消耗一部分时间,总的来说做了这个异常管理,方便快捷舒适。