JAVA 后台全局异常控制

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

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

二、异常重现

例子1:我们在开发过程中,开发完成,对接也完成了,有一些异常还是会出来,而且这种异常是不定出现,可能这次操作出现异常,下次一样的操作就不会出现异常,这种异常在我们进行对接调试的时候非常麻烦,调试这个异常需要花费很长的时间。

例子2:我们在进行开发的时候,我们在进行对接调试的时候,日志会滚动很快,即使有异常也很难定位到异常信息位置,这样就会导致开发人员在定位异常上面花费时间,重新去点击这个异常出现,进行调试,这样也很花费时间。

例子3:当应用进行上线后,测试很科学,也没有发现任何异常,但是有的异常很奇怪,莫明的出现,这个时候我们就得去翻日志,在最开始的时候日志系统会全盘开着,每天可能就是多少个G的日志,要从中去找异常那犹如就是大海捞针,费神又费力。

有了这个异常控制以后,我们就可以在异常里面快速定位这个异常,异常的参数是什么,异常的异常信息是什么,如果根据异常信息读取找出问题所在方法和行数,如果实在找不出来,直接进行异常参数自我验证,找出异常原因,从而进行异常重现。

三、实现原理

1、整合spring实现异常拦截

         实现spring的接口HandlerExceptionResolver重写resolveException该方法,配置bean为<bean id="exceptionResolver" class="com.xxx.xxx.xxExceptionHandler"/>,如果采用注解,直接在类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异常重现方式

这些异常存储到数据库,在进行一些手段控制,直接定位该异常是某个开发人员,开发人员解决没有,解决的时间是多久,等等....。

可以做一个后台异常信息管理,查看异常信息,如果异常信息中查看不出来问题,可以直接浏览器模拟发送请求,进行异常重现调试,这样非常快捷,为开发人员节省异常调试时间。可能在前期做这个异常管理期间会消耗一部分时间,总的来说做了这个异常管理,方便快捷舒适。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,我们可以通过捕获全局异常来处理程序中未被处理的异常全局异常处理器可以处理任何未被捕获的异常,无论是在应用程序的主线程还是在其他线程中发生。 下面是一个简单的示例代码,演示如何使用全局异常处理器: ```java public class GlobalExceptionHandler implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { // 处理异常的代码 System.out.println("An exception occurred: " + e.getMessage()); } public static void main(String[] args) { // 设置全局异常处理器 Thread.setDefaultUncaughtExceptionHandler(new GlobalExceptionHandler()); // 抛出一个异常 throw new RuntimeException("Oops, something went wrong!"); } } ``` 在上面的代码中,我们定义了一个名为 `GlobalExceptionHandler` 的类,它实现了 `Thread.UncaughtExceptionHandler` 接口,并重写了其中的 `uncaughtException` 方法。在 `main` 方法中,我们通过调用 `Thread.setDefaultUncaughtExceptionHandler` 方法来设置全局异常处理器为 `GlobalExceptionHandler` 类的实例。接下来,我们抛出一个运行时异常,这会导致全局异常处理器被调用。在这个处理器中,我们可以编写代码来处理异常,例如记录日志、发送错误报告等等。 需要注意的是,全局异常处理器只能处理未被捕获的异常。如果异常已经被 `try-catch` 块捕获,那么全局异常处理器将不会被调用。因此,在编写代码时,我们应该尽可能地使用 `try-catch` 块来捕获异常,并在必要时使用全局异常处理器来处理未被捕获的异常

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值