SpringBoot中异常处理实战记录

2023-01-21 0 467

目录

一、背景

在我们编写程序过程中,程序中可能随时发生各种异常,那么我们如何优雅的处理各种异常呢?

二、需求

1、拦截系统中部分异常,返回自定义的响应。

比如:

系统发生HttpRequestMethodNotSupportedException异常,我们需要返回如下信息。

http的状态码:返回 405

{
	code: 自定义异常码,
	message: 错误消息
}

2、实现自定义异常的拦截

拦截我们自己写的 BizException

三、编写一些异常基础代码

1、引入jar包

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
</dependencies>

注意:

引入spring-boot-starter-validation是为了验证请求的中的参数,然后当参数不满足时抛出异常。

2、定义一个自定义异常

public class BizException extends RuntimeException {
    public BizException() {
    }
    public BizException(String message) {
        super(message);
    }
    public BizException(String message, Throwable cause) {
        super(message, cause);
    }
    public BizException(Throwable cause) {
        super(cause);
    }
    public BizException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

解释

提供一个 /exception/password api,需要传递一个password参数

1、当不传递 password 参数时将抛出MethodArgumentNotValidException异常。

2、当password传递exception参数时,则抛出BizException异常。

4、测试

1、不传递password参数响应是什么

1、使用默认的DefaultHandlerExceptionResolver处理

这个类DefaultHandlerExceptionResolver是默认自动配置的。

SpringBoot中异常处理实战记录

从上图中可以看出有一个默认字段的返回值

SpringBoot中异常处理实战记录

2、使用ResponseEntityExceptionHandler处理

1、编写异常处理代码-使用默认的逻辑

@RestControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        // 此处自定义返回值
        return super.handleMethodArgumentNotValid(ex, headers, status, request);
    }
}

可以看到handleMethodArgumentNotValid方法直接调用父类的方法,即使用默认的处理方式。

SpringBoot中异常处理实战记录

从上图中可以看出返回值是空

2、编写异常处理代码-返回值返回自定义内容

@Component
@RestControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
	@Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        // 此处自定义返回值
        return super.handleMethodArgumentNotValid(ex, headers, status, request);
    }
        
	@Override
    protected ResponseEntity<Object> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        Set<HttpMethod> supportedMethods = ex.getSupportedHttpMethods();

        // 自定义请求返回值
        Map<String, Object> body = new HashMap<>(4);
        body.put(\"code\", \"错误码\");
        body.put(\"message\", \"当前请求的方法不支持,支持的请求方法为:\" + supportedMethods);

        return new ResponseEntity<>(body, headers, status);
    }
}

由上面的代码可知handleHttpRequestMethodNotSupported方法返回了自定义的body。

SpringBoot中异常处理实战记录

从上图中可以看出,返回了我们自己定义的返回值。

2、password参数传递exception1、使用ResponseEntityExceptionHandler或DefaultHandlerExceptionResolver处理

SpringBoot中异常处理实战记录

由上图可知返回结果不对,我们需要自定义返回结果。

2、返回自定义异常

1、编写BizException处理代码

@RestControllerAdvice
public class BizExceptionHandler {

    @ExceptionHandler(BizException.class)
    public ResponseEntity<Object> handleBizException(BizException exception) {
        // 自定义请求返回值
        Map<String, Object> body = new HashMap<>(4);
        body.put(\"code\", \"错误码\");
        body.put(\"message\", \"异常信息为:\" + exception.getMessage());
        return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

2、测试返回结果

SpringBoot中异常处理实战记录

从上图可知返回了自定义信息

四、注意事项

1、如果实现自定义异常处理类上使用@RestControllerAdvice注解方法上使用@ExceptionHandler来处理特定的异常

2、ResponseEntityExceptionHandler默认处理那些异常

SpringBoot中异常处理实战记录

3、使用了ResponseEntityExceptionHandler后,为什么发生了异常后返回体为空

SpringBoot中异常处理实战记录

默认情况下,实现了 ResponseEntityExceptionHandler这个类后,这个类处理的所有异常的响应结果都是 null,如果想返回别的值需要我们自己去处理。

五、总结

1、如果我们想处理自定义异常,则可以使用 @RestControllerAdvice || @ControllerAdvice 配置@ExceptionHandler来使用。

2、如果我们实现了ResponseEntityExceptionHandler来处理异常,那么默认的异常的响应结果为空,如果想不为空,则需要我们自己处理。

3、默认情况下,标准的Spring MVC异常会通过DefaultHandlerExceptionResolver来处理。

六、代码实现

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-exception-handler

七、参考文档

SpringBoot中异常处理实战记录

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 SpringBoot中异常处理实战记录 http://www.20zxx.cn/463652/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务