spring-boot统一异常处理

原创
2017/12/29 15:56
阅读数 187

统一异常处理

在程序中我们可以使用throw new Exception("发生错误)来直接抛出异常,如:

@RequestMapping("/hello")
public String hello() throws Exception {
    throw new Exception("发生错误");
}

此时,看到的报错页面显示404 Not Found,原因是:当处理抛出异常时,spring-boot提供了一个默认的映射:/error

那么如何实现我们自己的抛出的异常提示呢?

创建全局异常处理类:通过使用@ControllerAdvice定义统一的异常处理类。@ExceptionHandler用来定义函数针对的异常类型进行处理

在这里需要用到3个注解

  • @RestControllerAdvice 将类定义为统一的异常处理类
  • @ExceptionHandler 用来定义针对的异常类型处理的函数
  • @ResponseBody 设置返回数据为json

看看下面的实现

  • 自定义一个我们自己的异常类型,可以在程序中抛出这个异常
public class MyException extends RuntimeException{

    public MyException(String message){
        super(message);
    }

}
  • 在Controller中抛出我们自己定义的MyException异常
@Controller
public class HelloController {

    @RequestMapping("/hello")
    public String hello() throws MyException {
        throw new MyException("发生错误2");
    }

}
  • 通过使用@ControllerAdvice定义统一的异常处理类,使用@ExceptionHandler来定义函数针对的异常类型来匹配错误映射和处理
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class) //用来定义函数针对的异常类型为Exception类型
    @ResponseBody
    public ErrorReturn<Object> handlerException(Exception e)throws Exception{
        ErrorReturn<Object> r = new ErrorReturn<>();
        r.setCode("500");
        r.setData( "service error" );
        r.setMessage(e.getMessage());
        return r;
    }

    @ExceptionHandler(value=MyException.class) //用来定义函数针对的异常类型为MyException类型
    @ResponseBody
    public ErrorReturn<Object> jsonErrorHandler(HttpServletRequest req, MyException e) throws Exception{
        ErrorReturn<Object> r = new ErrorReturn<>();
        r.setCode("502");
        r.setMessage(e.getMessage());
        r.setData("service error");
        return r;
    }

}
  • 这样到我们抛出MyException异常时,就会调用jsonErrorHandler来处理,因为使用了@ResponseBody修饰,所以返回的结果会是json,返回的处理类型是ErrorReturn,我们定义一下
public class ErrorReturn<T> {

    private String code;
    private String message;
    private T data;
    
    //省略getter和setter
}
  • 最后我们访问 /hello 时会抛出MyException异常,这个异常被@RestControllerAdvice修饰的对象GlobalExceptionHandler所处理,在@ExceptionHandler(value=MyException.class)修饰中分配给jsonErrorHandler方法处理,处理结果是返回一个ErrorReturn对象的json,如下
{
    code: "502",
    message: "发生错误",
    data: "service error"
}
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
3 收藏
0
分享
返回顶部
顶部