spring-boot统一异常处理

╰+攻爆jí腚メ 2021-09-20 02:32 455阅读 0赞

统一异常处理

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

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

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

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

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

在这里需要用到3个注解

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

看看下面的实现

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

    public class MyException extends RuntimeException{

    1. public MyException(String message){
    2. super(message);
    3. }

    }

  • 在Controller中抛出我们自己定义的MyException异常

    @Controller
    public class HelloController {

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

    }

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

    @RestControllerAdvice
    public class GlobalExceptionHandler {

    1. @ExceptionHandler(value = Exception.class) //用来定义函数针对的异常类型为Exception类型
    2. @ResponseBody
    3. public ErrorReturn<Object> handlerException(Exception e)throws Exception{
    4. ErrorReturn<Object> r = new ErrorReturn<>();
    5. r.setCode("500");
    6. r.setData( "service error" );
    7. r.setMessage(e.getMessage());
    8. return r;
    9. }
    10. @ExceptionHandler(value=MyException.class) //用来定义函数针对的异常类型为MyException类型
    11. @ResponseBody
    12. public ErrorReturn<Object> jsonErrorHandler(HttpServletRequest req, MyException e) throws Exception{
    13. ErrorReturn<Object> r = new ErrorReturn<>();
    14. r.setCode("502");
    15. r.setMessage(e.getMessage());
    16. r.setData("service error");
    17. return r;
    18. }

    }

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

    public class ErrorReturn {

    1. private String code;
    2. private String message;
    3. private T data;
    4. //省略getter和setter

    }

  • 最后我们访问 /hello 时会抛出MyException异常,这个异常被@RestControllerAdvice修饰的对象GlobalExceptionHandler所处理,在@ExceptionHandler(value=MyException.class)修饰中分配给jsonErrorHandler方法处理,处理结果是返回一个ErrorReturn对象的json,如下

    {

    1. code: "502",
    2. message: "发生错误",
    3. data: "service error"

    }

转载于:https://my.oschina.net/tongjh/blog/1596719

发表评论

表情:
评论列表 (有 0 条评论,455人围观)

还没有评论,来说两句吧...

相关阅读