spring-boot统一异常处理

统一异常处理

在程序中我们可以使用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"
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值