程序员一定不能错过的全局异常处理

13 篇文章 1 订阅
7 篇文章 0 订阅

SpringBoot全局异常使用

自定义错误界面

Springboot自带的错误提示界面不太友好, 我们自己实现错误界面.

在src/main/resources/static 下面新建自定义错误页面404.html, 具体代码如下图所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="text" style="text-align: center">
    主人, 我累了, 让我休息一会!!!
</div>
</body>
</html>

然后新建ErrorPageConfig配置类, 具体代码如下图所示:

@Configuration
public class ErrorPageConfig {
    @Bean
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> customizer(){
        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {

            @Override
            public void customize(ConfigurableWebServerFactory factory) {
                ErrorPage errorPage = new ErrorPage(HttpStatus.NOT_FOUND, "/404.html");
                factory.addErrorPages(errorPage);
            }
        };}
}

我的Controller

@RestController
@RequestMapping("/start")
public class TestController {

}

然后在随便选择一个uri来访问, 让程序返回404, 如浏览器访问http://localhost:8080/start/sss , 结果如下图:

可以看到,已经达到自定义错误界面, 然后你可以自己美化一番.

全局异常处理

在项目中我们会遇到各种各样的业务处理, 我们希望这些异常能被统一处理.

统一封装自定义业务异常BusinessException, 该类继承自RuntimeException 异常类,

并提供带有异常信息的构造方法, 具体代码如下:

public class BusinessException extends RuntimeException{
    public BusinessException(){}

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

然后新建错误信息类ErrorInfo, 该类用于封装错误信息, 包括错误码, 具体代码如下:

public class ErrorInfo<T> {
    public static final Integer SUCCESS = 200;
    public static final Integer ERROR = 100;
    //错误码
    private Integer code;
    //错误信息
    private String message;
    private String url;
    private T data;
    
    //省略getter setter方法
}

其次, 新建一个统一异常处理类GlobalDefaultExceptionHandler, 具体代码如下:

/**
 * 描述: 统一业务异常处理类
 * @Author wuwei
 * @Date 2019/12/8 10:47 下午
 */
@RestControllerAdvice(basePackages = {"com.example.activemq.demo",})
public class GlobalDefaultExceptionHandler {
    @ExceptionHandler({BusinessException.class})
    //如果返回为json数据,就添加该注解
    @ResponseBody
    public ErrorInfo defaultErrorHandler(HttpServletRequest req, Exception e){
        ErrorInfo errorInfo = new ErrorInfo();
        errorInfo.setMessage(e.getMessage());
        errorInfo.setUrl(req.getRequestURI());
        errorInfo.setCode(ErrorInfo.SUCCESS);
        return errorInfo;
    }
}
  • @RestControllerAdvice: 定义统一的异常处理类, basePackages属性用于定义扫描哪些包, 默认可不配置.
  • @ExceptionHandler:用于定义方法 针对 的异常类型, 可以传入多个需要捕获的异常类, 我们这就只处理前面自定义的BusinessException这个异常类.
  • @ResponseBody: 如果返回的为json数据或其他对象, 就添加该注解.

然后在Controller里定义一个方法, 该方法手动抛出我们自定义的BusinessException异常,

具体代码如下:

/**
 * @Author wuwei
 * @Date 2019/12/8 10:24 下午
 */
@RestController
@RequestMapping("/start")
public class TestController {
    @RequestMapping("/findAll")
    public String findAll(){
        throw new BusinessException("业务异常");
    }
}

测试

然后我们在浏览器中请求这个方法, 浏览器输入 http://localhost:8080/start/findAll

结果图如下:

okay, 我们已经达到了处理异常的目的.

Over

如果觉得需要更多技术干货, 来我的博客 和 GitHub哦

CSDN: https://println.tk/

Github: https://github.com/uweii

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值