这几天在跟同事调接口过程中,经常遇到接口返回对方异常堆栈的错误信息。很明显是异常没有进行处理。一般我们会用标准的try-catch来捕获异常。
但是这样地处理只适合那种主动提示的检查时异常,因为你不用的try-catch就过不了编译检查,所以你能主动地抓获异常并进行处理。但是,如果存在运行时异常,你没有来得及想到去处理它的时候会发生什么,我们可以来先看看下面的这个没有处理运行时异常的例子?
@RestController
public class ExceptionRest {
@GetMapping("getNullPointerException")
public Map<String, Object> getNullPointerException() {
throw new NullPointerException("出现了空指针异常");
}
}
以上代码在基于Maven的用SpringMVC的项目中,使用的Tomcat启动后,浏览器端发起如下请求:
HTTP://本地主机:8080 / zxtest / getNullPointerException
访问后得到的结果是这样的:
可以看到,我们在控制器接口层抛出了一个空指针异常,然后没有捕获,查询查询结果异常堆栈就会报道查看给前端浏览器,给用户造成了非常不好的体验。
除此之外,前端从报错信息中能看到后台系统使用的服务器及中间件类型,所采用的框架信息及类信息,甚至如果后端抛出的是SQL异常,那么还可以看到SQL异常的具体查询的参数信息,这是一个中危安全漏洞,是必须要修复的。
PS:上面的项目如果使用SpringBoot的话可能在前端得不到报错信息,因为SpringBoot自动对返回的报错内容做了处理,我们需要使用的Maven的网站模板创建一个只包含用SpringMVC的项目来复现以上场景。
二,如何做到统一处理?
当出现这种运行时异常的时候,我们想到的最简单的方法也许就是给可能会抛出异常的代码加上异常处理,如下所示:
@RestController
public class ExceptionRest {
private Logger log = LoggerFactory.getLogger(ExceptionRest.class);
@GetMapping("getNullPointerException")
public Map<String,Object> g