在完成spring mvc 项目过程中 异常是一个不可避免的需要处理的重点
例如:
1):用户正在访问我们的网站,数据库服务器挂掉了,这时候肯定会产生在调用数据库过程中连接所产生的异常
2):后端程序员的一个失误没有考虑到某些特定情况下产生null数据而引发的空指针异常
那怎么解决这个问题呢?
方案1:
try {
msg=userService.addUser(user);
}catch (ValidatorException e) {
return new JsonResult(ResultCode.VALIDATE_ERR,e.getMessage());
}
catch (Exception e) {
return new JsonResult(ResultCode.EXCEPTION);
}
利用try…catch…机制手工抓取到异常,并且对异常进行处理,将异常信息返回到前端,让前端工程师提示用户:系统当前可能产生了异常
方案2:
方案1处理是可以处理的,但如果代码多了就很麻烦,每个里边都try…catch…虽然很规范,但是写多了容易掉头发
最简单的解决方案:
spring 为解决这个问题呢,首先给我们提供了一个非常棒的注解:@ControllerAdvice
这个注解的作用主要是:监控所有的@RequestMapping,在它们身上所发生的异常都会被捕获,上代码:
@RestControllerAdvice //因为都是json格式返回给前端,所以用这个东西
public class ControllerExceptionAdvice {
@ResponseBody
@ExceptionHandler(java.lang.Exception.class)
public JsonResult handleEXCEPTION(){
return new JsonResult(ResultCode.EXCEPTION, ResultCode.EXCEPTION.msg());
}
重点是这句话:@ExceptionHandler(java.lang.Exception.class)
java.lang.Exception.class
所有该情形下的异常就会交由我们规定好的handleEXCEPTION这个方法处理了
最后上controller的代码
@RequestMapping(value="/sayHello11/{name}",method=RequestMethod.GET)
public String sayHello11(@PathVariable("name")String name) throws Exception{
int i=1;
if("xinlanzhu".equals(name)){
i=1/0;
}
return "hello boot"+name+" "+i;
}
这个位置就不需要辛苦的去try…catch…了,我们直接抛出,当产生异常的时候,自动会捕捉异常并进入我们写的@ExceptionHandler里边去自动处理了